Перехват исключений с помощью BeginRead в C # - PullRequest
3 голосов
/ 24 июля 2010

При использовании асинхронного кода для чтения из потоков и т. Д. С использованием шаблона BeginXXX / EndXXX, я считаю, что любые исключения, возникающие в ходе процесса, будут выброшены при выполнении вызова EndXXX.

Означает ли это, чтопервоначальный вызов BeginXXX никогда не вызовет исключение, он всегда будет вызываться EndXXX?

Или, если выразиться иначе, если я также включу BeginRead с try {} catch {}?

public StartReading()
{
        // Should this be enclosed with try{}catch{} ?
        stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(readCallback), stream);
}

private void readCallback(IAsyncResult result)
{
    Stream stream = (Stream)result.AsyncState;

    try
    {
        int len = stream.EndRead(result);

        // Do work...

    }
    catch(Exception ex)
    {
        // Error handling stuff.
    }
}

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

Ну, любой код может выдать исключение, поэтому "никогда" не является сильным ... например, OutOfMemoryException, ThreadAbortException или другое исключение, которое указывает на насыщение ресурса (напримерон почему-то не может запустить асинхронную операцию,И он будет определенно бросать немедленно, если stream окажется null.

Однако!Во всех случаях, которые я упомянул, правильное поведение, вероятно, должно позволить этому пузыриться;все они указывают на довольно фундаментальные проблемы, не связанные с текущей логикой.Так что нет: я бы не стал try / catch здесь, если бы не было чего-то специфического Я ожидал и хотел как-то справиться.

1 голос
/ 24 июля 2010

Простое доказательство:

public StartReading()
{      
    // Should this be enclosed with try{}catch{} ?
    buffer = null; // now it will throw
    stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(readCallback), stream);
}

Так что да, вы должны предвидеть исключения здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...