如何实现try / catch块?

时间:2010-09-27 09:39:41

标签: error-handling implementation

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

6 个答案:

答案 0 :(得分:8)

  

这不是c#/ java / c ++问题。它如何在内部工作,该行如何知道去捕获语句。

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

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

Vishal Kochhar在以下文章中详细解释了更多细节:

  

<强> How a C++ compiler implements exception handling

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

答案 3 :(得分:0)

它应该适用于所有语言:

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

答案 4 :(得分:0)

它基本上解析了语言的基础知识。 您可以在Here

获取所有信息

答案 5 :(得分:0)

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

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