【问题标题】:Internal mechanism of the Try Catch Block? How .net framework actually do it?Try Catch 块的内部机制? .net 框架实际上是如何做到的?
【发布时间】: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


【解决方案1】:

它是否像 SQL 中的提交或回滚方法一样工作?

不,它没有。 Clr 不保存变量的旧值。如果你抛出异常,clr 只会跳回到堆栈中的上一个方法。

使用 try catch 会导致性能问题吗?

是的,确实如此。如果抛出异常,clr 会创建堆栈跟踪。这是一个非常昂贵的操作。但只是 try/catch 块不会产生严重的性能副作用。

我们需要对每个小函数都使用 try catch 吗?

这取决于你的编码风格。

有人可以向我们解释一下.net 框架是如何处理这个非常有用的功能的吗?我想要一个深入的技术答案。 (幕后)

有一篇关于它的好文章:http://codinglight.blogspot.ru/2008/08/recently-i-received-question-on.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2017-09-30
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2012-11-12
    • 2016-02-01
    相关资源
    最近更新 更多