При использовании асинхронного кода для чтения из потоков и т. Д. С использованием шаблона 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.
}
}
Я полагал, что «никогда» не будет генерировать мнение :) Введенный код был всего лишь скелетом, чтобы объяснить мой вопрос, поэтому, предполагая, что я выполняю правильные проверки параметров, переданных в BeginXXX, любые исключения не будут специфичны для вызова а для приложения в целом? – Andy
@ Andy - исключения, относящиеся к * чтению данных *, должны выходить из 'EndXXX'. «Исключения Braindead» (см. Блог Эрика Липперта) или исключения из-за болезни могут происходить из любого места. –
Спасибо. +1 для справки «Исключение исключений Braindead»! – Andy