2

它几乎在每种语言中都可以找到,而且我大部分时间都在使用它。我不知道它是内部的,想知道它是如何工作的。

它如何在任何语言的运行时在本机级别工作?

例如:如果在 try 中发生 stackoverflow 或 dividebyzero,那么 catch 如何防止程序下降?

4

2 回答 2

3

声明“在任何语言的运行时处于本机级别”是矛盾的。异常处理的所有本机部分都依赖于平台,而不是语言。异常处理的某些部分甚至依赖于硬件(例如,除以零总是硬件异常。)

在 .NET、Windows、x86 上除以零的特定情况下,它是这样的:

  • 您的应用程序尝试除以零。
  • CPU 保存一些应用程序状态并执行位于陷阱表中“除错”地址的代码(这恰好是陷阱表的第 0 个元素。)
  • 陷阱处理程序代码(它是 Windows 内核的一部分)触发机制最终(在执行程序中)引发除以零的 SEH 异常,该异常将传播到对象管理器,然后传播到 .NET 运行时。
  • mscoree.dll 中的 .NET 运行时代码将除以零作为来自 COM 对象的 HRESULT COR_E_DIVIDEBYZERO。
  • .NET 将 HRESULT 转换为 System.DivideByZeroException。
  • 您的代码将异常视为到“最近”封闭的 catch 块或 finally 块的美化长跳转。
  • 您要么处理异常,要么将其从您的代码中传播出去,然后您的应用程序崩溃。

通常,您可以将异常视为带有指向某些线程本地状态信息(异常)的指针的长跳转。跳远的目标通常在编译时就知道了。

也不是每种语言都内置了异常处理。例如,C 没有结构化的异常处理。

于 2012-06-19T08:30:56.433 回答
0

当抛出异常并且控制从 try 块传递到处理程序时,运行时调用自 try 块开始以来构造的所有自动对象的析构函数。这个过程称为堆栈展开

于 2012-05-19T05:17:05.893 回答