2010-07-24 2 views
3

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

Означает ли это, что первоначальный вызов 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

Ну, любого код может выбросить исключение, так что «никогда» не силен ... например, OutOfMemoryException, ThreadAbortException, или какое-либо другое исключение, которое указует насыщенность ресурса (например, это как-то может не запускать операцию async).

Это может (хотя я не проверял) также бросить сразу если это только для записи потока. И это будет обязательно сразу же выбросить, если stream окажется null.

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

+0

Я полагал, что «никогда» не будет генерировать мнение :) Введенный код был всего лишь скелетом, чтобы объяснить мой вопрос, поэтому, предполагая, что я выполняю правильные проверки параметров, переданных в BeginXXX, любые исключения не будут специфичны для вызова а для приложения в целом? – Andy

+0

@ Andy - исключения, относящиеся к * чтению данных *, должны выходить из 'EndXXX'. «Исключения Braindead» (см. Блог Эрика Липперта) или исключения из-за болезни могут происходить из любого места. –

+0

Спасибо. +1 для справки «Исключение исключений Braindead»! – Andy

1

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

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); 
} 

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

+0

Спасибо за ваш ответ. Пожалуйста, см. Мой комментарий к Марку. – Andy

+0

@ Энди Да, я согласен с тем, что большинство дел было бы неактуальным. Единственное, о чем нужно беспокоиться, это «Стрим». Если это не-null, но каким-то образом недействительным, произойдет ли исключение в BeginRead или в EndRead? (Я не знаю). –

Смежные вопросы