Куда идут необработанные исключения с асинхронным вводом-выводом - PullRequest
2 голосов
/ 21 февраля 2009

Я занимаюсь разработкой консольного приложения .NET (с использованием моно). Я использую асинхронный ввод-вывод (Begin / EndReceive).

Я нахожусь в середине цепочки обратных вызовов глубиной в несколько уровней, и, если выброшено исключение, оно никуда не попадает (то, что я ожидаю, это пузырь на консоль, поскольку в настоящее время нет исключения обработка).

Однако, глядя на трассировку стека, когда я регистрирую ее в той точке, где она происходит, стек не показывает, что она возвращается к начальной точке выполнения.

Я попробовал трюк AppDomain.UnhandledException, но в этой ситуации это не работает.

System.ArgumentOutOfRangeException: Argument is out of range.
Parameter name: size
  at System.Net.Sockets.Socket.BeginReceive (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags socket_flags, System.AsyncCallback callback, System.Object state) [0x00000] 
  at MyClass+State.BeginReceive () [0x00000] 

Ответы [ 3 ]

2 голосов
/ 21 февраля 2009

Я считаю, что любая ошибка, генерируемая во время асинхронного вызова, должна возникать при вызове метода EndAction ( EndReceive в вашем случае). По крайней мере, это то, что я испытал при использовании реализации CLR (MSFT), и Mono должен делать то же самое, хотя здесь может , возможно, слегка глючить (однако это маловероятно). Если бы вы работали в Visual Studio, я бы порекомендовал вам включить опцию перехвата всех исключений (i) в меню «Отладка> Исключения») - возможно, есть аналогичная опция в любой IDE, которую вы используете?

0 голосов
/ 21 февраля 2009

При использовании Microsoft .NET обычно большинство исключений, генерируемых во время асинхронных вызовов, возникает внутри метода асинхронного обратного вызова, за исключением нескольких случаев. Для обработки остальных я обычно устанавливаю метод обратного вызова тайм-аута.

0 голосов
/ 21 февраля 2009

С точки зрения стека, исключение создается в BeginReceive, поэтому конкретная операция ввода-вывода вообще не инициируется.

Поведение по умолчанию (начиная с CLR2.0) необработанного исключения в потоке пула потоков заключается в прекращении процесса, поэтому, если вы этого не видите, что-то перехватывает исключение.

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