【发布时间】:2011-04-17 16:26:57
【问题描述】:
如果try 块中发生异常,如何将执行转移到catch 块?这不是 C#/Java/C++ 问题,我只是想知道它在内部是如何工作的。
【问题讨论】:
标签: error-handling implementation
如果try 块中发生异常,如何将执行转移到catch 块?这不是 C#/Java/C++ 问题,我只是想知道它在内部是如何工作的。
【问题讨论】:
标签: error-handling implementation
本地编译语言(如 C++)和使用字节码的语言(如 Java 或 C#)在技术上处理异常的方式有所不同。
C++ 编译器通常会生成代码,这些代码会在运行时对异常处理所需的信息进行协议。使用专用数据结构来记住尝试块的进入/退出和相关的异常处理程序。当异常发生时,会产生中断并将控制权传递给操作系统,然后操作系统会检查调用堆栈并确定要调用哪个异常处理程序。
Vishal Kochhar 的以下文章很好地解释了更多细节:
在 Java 或 .NET 中,不需要维护异常处理信息的开销,因为运行时将能够自省字节码以找到相关的异常处理程序。因此,只有实际抛出的异常才会导致开销。
【讨论】:
它基本上是解析语言的基础知识。 您可以通过Here获取所有信息
【讨论】:
它应该适用于所有语言,有点像这样:
if (error_occured xy while doing things in try){
call_catch_part(error xy)
}
【讨论】:
这不是一个 c#/java/c++ 问题。它如何在内部工作,该行如何知道 go catch 语句。
这是如何在内部工作的,这几乎是一个 c#/java/C++ 问题(因为它的实现方式不同)。
在 Java 中,try 块将自身安装到一个特殊的表中(在类文件中)。当 JVM 抛出异常时,它会查看该表以查看下一个要执行的 catch 或 finally 块在哪里。
【讨论】:
当发生异常时,会执行一条特殊指令(通常称为中断)。这导致执行一个通用错误处理程序,该错误处理程序推断出哪个是最新安装的合适的异常处理程序。然后执行该处理程序。
【讨论】:
int,该指令被执行并暂停程序,然后控制权自动转移到操作系统中断处理程序,后者又看到它是 C++异常并将控制权转移到 C++ 异常处理程序。