try/catch块是如何实现的?

20

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

6个回答

11

这不是C#/Java/C ++问题。它是如何在内部工作的,代码行是如何知道去到catch语句。

想要理解其内部工作原理,这基本上就是一个C#/Java/C++问题(因为它们的实现方式可能不同)。

在Java中,try块会将自己安装到特殊表格(位于类文件中)。当JVM抛出异常时,会查看该表格以确定下一个catch或finally块的位置。


6

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


只有这些是已知的...子处理程序先执行...我期望从系统软件/汇编/.net框架得到答案。 - selvaraj
你能解释一下“无论你认为什么”的特殊指令吗? - selvaraj
2
@saj:在本地C++程序中,使用特殊的处理器指令int,该指令被执行并停止程序,然后控制自动转移到操作系统中断处理程序,后者会看到它是一个C++异常,并将控制权转移到C++异常处理程序。 - sharptooth

6

在本地编译语言(如C++)和使用虚拟机执行字节码的语言(如Java或C#)之间,异常处理技术上存在差异。

C++编译器通常会生成代码以记录运行时所需的异常处理信息。一个专用的数据结构用于记住try块的进入/退出和相关的异常处理程序。当异常发生时,会生成中断并将控制权传递给操作系统,操作系统再检查调用堆栈并确定要调用哪个异常处理程序。

有关详细信息,请参阅Vishal Kochhar的以下文章:

C++编译器如何实现异常处理

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


1

这基本上是语言解析的基础。你可以在这里获取所有信息。


0

它应该在所有语言中都能像这样工作:

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

0

即使在C语言中没有异常处理机制,您仍然可以做同样的事情。

在这种情况下,您将使用setjmp/longjmp,但不幸的是,您将无法获得堆栈展开,并且必须自己处理所有细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接