怎么试试......抓住...... [终于]工作了?

时间:2012-05-19 05:12:50

标签: try-catch

它几乎在所有语言中都有发现,我大部分时间都在使用它。 我不知道它是内部的,并且想知道它是如何运作的。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

  • 您的应用尝试除以零。
  • CPU保存一些应用程序状态,并在陷阱表中执行位于“Divide Error”地址的代码(这恰好是陷阱表的第0个元素。)
  • 陷阱处理程序代码(它是Windows内核的一部分)触发机制最终(在执行程序中)引发除以零的SEH异常,该异常将传播到对象管理器,然后传播到.NET运行时。 / LI>
  • mscoree.dll中的.NET运行时代码从COM对象获取HRESULT COR_E_DIVIDEBYZERO除以零。
  • .NET将HRESULT转换为System.DivideByZeroException。
  • 你的代码认为异常是对“最近的”封闭式拦截区的一个美化的跳远,或者最后阻止。
  • 您要么处理异常,要么将其传播出您的代码,然后您的应用程序崩溃。

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

并非每种语言都内置了异常处理。例如,C没有结构化异常处理。

答案 1 :(得分:0)

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