【发布时间】:2016-05-23 03:20:23
【问题描述】:
我知道如何使用 try catch finally 块。每个人都这样做。
但我想知道这个伟大功能的内部实现。它是否像 SQL 中的提交或回滚方法一样工作?
使用 try catch 会导致性能问题吗?
我们需要对每个小函数都使用 try catch 吗?
.net 程序会提前一步并将结果保存在 ram 中吗?
有人可以向我们解释一下.net 框架是如何处理这个非常有用的功能的吗?我想要一个深入的技术答案。 (幕后)
【问题讨论】:
-
没有提交或回滚功能。你必须实现它。就实现而言,它很复杂,但如果没有抛出异常,通常不会产生开销。当它们被抛出时,有一种算法可以在当前函数中或更高的链上查找 catch 块(实际上,分两个阶段,一个在堆栈上,一个在堆栈下)。这很昂贵,但没关系,因为它适用于特殊(即,希望很少见)行为。
-
除非你真的准备好处理错误,否则不要使用 try/catch。如果没有,那么让它冒泡给调用者。大多数时候,你会希望它冒泡。不过,使用 try/finally 很好,因此您可以回滚任何内容或确保某些活动发生而不管异常情况。
-
您可以轻松获取幕后信息,来源is readily available。相当多的代码,它是 CLR 中第三大的源文件。它最终搭载了 Windows 上的 SEH(结构化异常处理),这可能是您真正想研究的主题。
标签: .net try-catch try-catch-finally .net-framework-version try-finally