【问题标题】:How are try/catch blocks implemented?try/catch 块是如何实现的?
【发布时间】:2011-04-17 16:26:57
【问题描述】:

如果try 块中发生异常,如何将执行转移到catch 块?这不是 C#/Java/C++ 问题,我只是想知道它在内部是如何工作的。

【问题讨论】:

    标签: error-handling implementation


    【解决方案1】:

    本地编译语言(如 C++)和使用字节码的语言(如 Java 或 C#)在技术上处理异常的方式有所不同。

    C++ 编译器通常会生成代码,这些代码会在运行时对异常处理所需的信息进行协议。使用专用数据结构来记住尝试块的进入/退出和相关的异常处理程序。当异常发生时,会产生中断并将控制权传递给操作系统,然后操作系统会检查调用堆栈并确定要调用哪个异常处理程序。

    Vishal Kochhar 的以下文章很好地解释了更多细节:

    How a C++ compiler implements exception handling

    在 Java 或 .NET 中,不需要维护异常处理信息的开销,因为运行时将能够自省字节码以找到相关的异常处理程序。因此,只有实际抛出的异常才会导致开销。

    【讨论】:

      【解决方案2】:

      即使 C 本身没有异常处理,你也可以在 C 中做同样的事情。

      在那里你会使用setjmp/longjmp 不幸的是你没有得到堆栈展开并且必须自己处理所有的细节。

      【讨论】:

        【解决方案3】:

        它基本上是解析语言的基础知识。 您可以通过Here获取所有信息

        【讨论】:

          【解决方案4】:

          它应该适用于所有语言,有点像这样:

          if (error_occured xy while doing things in try){
            call_catch_part(error xy)
          }
          

          【讨论】:

            【解决方案5】:

            这不是一个 c#/java/c++ 问题。它如何在内部工作,该行如何知道 go catch 语句。

            这是如何在内部工作的,这几乎是一个 c#/java/C++ 问题(因为它的实现方式不同)。

            在 Java 中,try 块将自身安装到一个特殊的表中(在类文件中)。当 JVM 抛出异常时,它会查看该表以查看下一个要执行的 catch 或 finally 块在哪里。

            【讨论】:

              【解决方案6】:

              当发生异常时,会执行一条特殊指令(通常称为中断)。这导致执行一个通用错误处理程序,该错误处理程序推断出哪个是最新安装的合适的异常处理程序。然后执行该处理程序。

              【讨论】:

              • 这一切都知道..子处理程序首先执行..我期待系统软件/程序集/.net框架的回答
              • 您能解释一下您认为的特殊说明吗
              • @saj:在本机 C++ 程序中,使用了一个特殊的处理器指令 int,该指令被执行并暂停程序,然后控制权自动转移到操作系统中断处理程序,后者又看到它是 C++异常并将控制权转移到 C++ 异常处理程序。
              猜你喜欢
              • 1970-01-01
              • 2013-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多