如果在try
块中发生异常,执行如何转移到catch
块?这不是C# / Java / C ++问题,我只是想知道它的内部工作原理。
如果在try
块中发生异常,执行如何转移到catch
块?这不是C# / Java / C ++问题,我只是想知道它的内部工作原理。
这不是C#/Java/C ++问题。它是如何在内部工作的,代码行是如何知道去到catch语句。
想要理解其内部工作原理,这基本上就是一个C#/Java/C++问题(因为它们的实现方式可能不同)。
在Java中,try块会将自己安装到特殊表格(位于类文件中)。当JVM抛出异常时,会查看该表格以确定下一个catch或finally块的位置。
当出现异常时,会执行一个特殊的指令(通常称为中断)。这将导致执行通用的错误处理程序,该程序推断出最新安装的适当异常处理程序。然后执行该处理程序。
在本地编译语言(如C++)和使用虚拟机执行字节码的语言(如Java或C#)之间,异常处理技术上存在差异。
C++编译器通常会生成代码以记录运行时所需的异常处理信息。一个专用的数据结构用于记住try块的进入/退出和相关的异常处理程序。当异常发生时,会生成中断并将控制权传递给操作系统,操作系统再检查调用堆栈并确定要调用哪个异常处理程序。
有关详细信息,请参阅Vishal Kochhar的以下文章:
在Java或.NET中,无需维护异常处理信息的开销,因为运行时可以自省字节码以找到相关的异常处理程序。因此,只有实际抛出的异常会导致开销。
它应该在所有语言中都能像这样工作:
if (error_occured xy while doing things in try){
call_catch_part(error xy)
}
int
,该指令被执行并停止程序,然后控制自动转移到操作系统中断处理程序,后者会看到它是一个C++异常,并将控制权转移到C++异常处理程序。 - sharptooth