C# 中异常处理的范围是什么。我目前正在审查我团队中另一位程序员的一些代码,他的功能布局有点像这样:

private void function1() {
try {
function2();
}
catch (Exception ex) {
EmailException(ex.message());
}}

private void function2() {
try {
// Do stuff
}
catch (Exception ex) {
// Handle it here
}}

大部分处理代码在 function2 中。然而,他的报告处理在功能1中。函数 2 中的异常会回到发送报告的函数 1 处理程序吗?

编辑:
感谢您的回复,他们都非常有帮助!

最佳答案

在.net中,当发生异常时,系统会在栈上的嵌套try块中进行搜索,以确定是否有能够捕获异常的catch块。这发生在任何 finally 块运行之前。如果没有任何块可以捕获异常,系统将调用“未处理的异常”处理程序而不运行任何 finally 块。

如果系统确定存在可以捕获异常的块,它将开始展开堆栈并运行与内部 finally 块关联的 try 块,直到它已将堆栈展开到它找到的 catch 块,或者在 finally 块的执行中抛出异常。在后一种情况下,前面的异常将被放弃,不再进一步处理;异常处理将以新抛出的异常重新开始。

尽管想要捕获异常与仅仅想要对其采取行动(但让它被视为未捕获)之间存在语义差异,但在 C# 中没有明确的方式来表达这种差异;捕获异常的代码有望解决它。在 C# 中可以做的最好的事情是使用 catch (指示系统的异常处理逻辑认为一个人会捕获异常),然后使用 throw ,表明一个人根本不想解决它(这个将在内部“finally”块运行后发生)。在其他一些语言(例如 vb.net)中,可以在 finally 块运行之前对异常采取行动,而无需捕获它们。虽然 catchthrow 与在没有 catch 的情况下捕获异常不同的情况并不多,但很少有区别很重要的情况。如果使用 C# 并且希望避免对可能想要在终结器块运行之前从内部代码捕获异常的周围代码怀有敌意,最好的方法可能是编写一个用 vb 编写的异常处理包装器方法(或让其他人这样做),将其编译为 DLL,然后使用 lambda 来提供这样的函数方法,以便它在合适的 try/filter/catch/finally 块中调用。

关于C# 异常处理范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10917543/

10-17 02:27