C# 正在作为FatalExecutionEngineerError引发的DivideByZeroException未捕获

C# 正在作为FatalExecutionEngineerError引发的DivideByZeroException未捕获,c#,C#,我的C#(.NETFramework 4.6.2)应用程序在没有日志的情况下崩溃。经过几天的反复试验,我发现源代码似乎是一个简单的除以零的bug。但是,该段代码处于try-catch中,但调试器(Visual Studio 2019 v16.2.5)没有被抛出和捕获,而是显示了一个未捕获的“FatalExecutionEngineError” 托管调试助手'FatalExecutionEngineError':'运行时遇到致命错误。错误地址位于线程0x760c上的0xf7bee845。错误代码为

我的C#(.NETFramework 4.6.2)应用程序在没有日志的情况下崩溃。经过几天的反复试验,我发现源代码似乎是一个简单的除以零的bug。但是,该段代码处于try-catch中,但调试器(Visual Studio 2019 v16.2.5)没有被抛出和捕获,而是显示了一个未捕获的“FatalExecutionEngineError”

托管调试助手'FatalExecutionEngineError':'运行时遇到致命错误。错误地址位于线程0x760c上的0xf7bee845。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM interop或PInvoke的用户封送错误,这可能会损坏堆栈。

继续后,将显示此异常,然后应用程序进程终止

System.ExecutionEngineeException:引发了“System.ExecutionEngineeException”类型的异常。

即使没有附加调试程序,也会发生这种情况

很奇怪。有没有办法捕获这种类型的异常?什么可能导致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变量被替换为一个固定的数字,这个问题是否还会发生。是的


在Visual Studio中,默认设置禁止某些异常在抛出时中断

捕获所有异常的方法是在Visual Studio的“异常”窗口中从以下位置更改此默认设置:

为此:


这“并不总是”有帮助,但这是一个很好的开始,因为当你在实际抛出的线路上中断时,调用堆栈会更直接。

如果尝试。。catch没有捕获它,您可能没有适合该异常的catch()语句。或者,异常可能来自该代码之外。您能否提供一些您认为异常来自何处的示例代码?为什么您认为这与除法0有关?0xC0000005是状态\u访问\u冲突。您的应用程序是否使用非托管代码(通过COM Interop或P/Invoke)?
金额如何/为什么会一直等于
0
?在进入这里之前,你有没有退后一步来确定场景并做出决定?我会听从洛普帕兹的评论-“…来自代码之外?”你显然是想在这里做一些工作,这似乎是继续下去的必要条件。为什么
amount
会是
0
呢?什么是
bmp
?您确定访问其高度和宽度属性有效吗?我这样问是因为这可能需要运行一些非托管代码;因为被零除本身会导致异常,但不是这个异常。例如,设置异常处理程序块时可能出错,或者代码优化不正确,而异常位置本身就是个麻烦。尝试以相反的位(32位与64位)运行应用程序,并改变代码(例如,删除异常处理程序并拆分方法)。感谢您的提示。这似乎没有什么区别。未捕获异常,VS报告了FatalExecutionEngineer错误,与以前一样。