DivideByZeroException выбрасывается как FatalExecutionEngineError, не перехвачено - PullRequest
0 голосов
/ 26 мая 2020
Приложение

My C# (. Net Framework 4.6.2) вылетало без логов. После нескольких дней проб и ошибок я обнаружил, что исходный код представляет собой простую ошибку деления на ноль. Однако этот фрагмент кода находится в перехвате попытки, но вместо того, чтобы быть брошенным и пойманным, отладчик (Visual Studio 2019 v16.2.5) показывает неперехваченную ошибку «FatalExecutionEngineError».

Managed Debugging Assistant 'FatalExecutionEngineError' : 'The runtime has encountered a fatal error. The address of the error was at 0xf7bee845, on thread 0x760c. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

После продолжения это исключение отображается, а затем процесс приложения умирает.

System.ExecutionEngineException: 'Exception of type 'System.ExecutionEngineException' was thrown.

Кажется, это происходит, даже если нет отладчик прилагается.

Очень странно. Есть ли способ поймать этот тип исключения? Что может быть причиной того, что DivideByZeroException не перехватывается?

Вот часть кода:

{
...
///line that causes the exception when 'amount' is zero
int toScaleToWidth = (int)(bmp.Width / amount), toScaleToHeight = (int)(bmp.Height / amount);
...
}
catch(Exception ee)
{
//logging
}

Обновить. Некоторые полезные комментарии @gravity и @ KlausGütter заставили меня задуматься, возникнет ли проблема, если бы переменная bmp.Width была заменена фиксированным числом. Оно делает.

Exception thrown on this line

1 Ответ

1 голос
/ 26 мая 2020

В Visual Studio настройки по умолчанию подавляют прерывание определенных исключений в момент их выброса.

Способ перехвата ВСЕХ исключений состоит в том, чтобы изменить этот параметр по умолчанию в окне «Исключения» в Visual Studio следующим образом:

enter image description here

на это:

enter image description here

Это не " всегда "помощь, но это хорошее начало, потому что стек вызовов будет более быстрым, когда вы прерываете строку, которая на самом деле выбрасывает.

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