![]() |
1
7
标准中关于执行顺序的陈述是正确的,与你所观察到的不一致。“未处理的异常”消息允许出现在 任何 指向进程,因为它只是来自clr的消息,而不是异常处理程序本身。关于执行顺序的规则只适用于在clr内部执行的代码,而不适用于clr本身所做的。 实际上,您所做的是公开一个实现细节,即通过查看一个堆栈来识别未处理的异常,该堆栈尝试块我们在其中,而不是通过一路深入到根目录来识别。例外可能是也可能不是 处理 通过查看此堆栈,可以识别未处理的异常。 正如您可能意识到的,如果您在主函数中放置一个顶级的try catch,那么您将看到您期望的行为:在检查下一帧是否匹配catch之前,将最终执行每个函数。 |
![]() |
2
2
我读东西的方式可能有点离谱……但是你有一个尝试性的最后一个街区,没有一个陷阱。 根据您发布的描述判断,由于从未捕捉到异常,它会冒泡到调用方,在堆栈中向上工作,最终未处理,调用终止,然后调用finally块。 |
![]() |
3
2
输出实际上来自默认的clr异常处理程序。异常处理程序发生在finally块之前。在finally块之后,clr由于未处理的异常而终止(它不能在之前终止,因为c保证[1]调用finally子句)。 所以我想说这只是标准行为,异常处理在最后发生之前就发生了。 [1]保证在正常运行期间,至少在没有内部运行错误或断电的情况下。 |
![]() |
4
2
|
![]() |
5
2
要在混合物中添加更多,请考虑:
在我的系统(挪威语)上显示:
|
![]() |
6
1
虽然不是完全预期的,但程序确实按其应该的方式运行。finally块不应首先运行,只应始终运行。 我调整了你的样品:
在这种情况下,您将得到讨厌的未处理异常对话框,但之后控制台将输出并等待输入,从而执行finally,而不是在Windows本身捕获未处理异常之前。 |
![]() |
7
0
没有catch的try/finally将使用默认的处理程序,该处理程序执行您看到的操作。我一直在使用它,例如,在处理异常时会覆盖一个错误,但您仍然需要做一些清理。 还要记住,输出到标准错误和标准输出是缓冲的。 |
![]() |
8
0
Try-Catch Finally块的工作方式与您预期的完全一致 如果他们在某个地方被抓到 .当我为此编写了一个测试程序,并且使用了各种嵌套级别时,它的行为方式与您所描述的一致,唯一的情况是异常完全由代码处理,并且冒泡到操作系统。 每次运行时,操作系统都会创建错误消息。 因此,问题不在于C,而在于用户代码未处理的错误是 不再受申请控制 因此,运行时(我相信)不能强制它执行模式。 如果您创建了一个Windows窗体应用程序,并将所有消息写入文本框(然后立即将其刷新),而不是直接写入控制台,则根本看不到该错误消息,因为它是由调用应用程序而不是由您自己的代码插入到错误控制台中的。 编辑
我会尽量强调其中的关键部分。
未处理的异常超出您的控制范围,您无法确定何时执行它们的异常处理程序。
如果你抓住了例外
在某一时刻
在您的应用程序中,然后
|
![]() |
9
0
要将两个答案放在一起,会发生的情况是,一旦在AppDomain上出现未处理的异常,就会在AppDomain上引发UnhandledExceptionEvent,然后代码继续执行(即,最终执行)。这是 MSDN Article on the event |
![]() |
10
0
下一步:
在您的代码中,当抛出异常时,只有缺省处理程序在SEH链中。在开始展开任何堆栈之前调用此处理程序。 默认的异常处理程序知道堆栈上没有注册异常处理程序。因此,它首先调用所有已注册的UnhandledException处理程序,然后打印其错误消息并标记要卸载的AppDomain。 只有在堆栈展开之后,才会开始,最后根据C标准调用块。 正如我看到的,在C标准中,不会考虑clr处理未处理异常的方式,只考虑堆栈展开期间调用finallys的顺序。此订单保留。在此之后,“此类终止的影响被定义为实施。”条款生效。 |
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
![]() |
zaen · 将值传递到异常字符串消息中 2 年前 |
![]() |
Zephyr · 如何在双ListView选择系统上实现过滤器? 6 年前 |
![]() |
Aave · 错误数组长度的特定异常 6 年前 |