当前位置: 首页 > 面试题库 >

在低(组装)级别如何捕获和处理异常?

慕乐语
2023-03-14
问题内容

我有此代码-

try {
     doSomething();
} catch (Exception e) {
   e.printStackTrace();
}

编译器将如何实际实现这一点。实际在汇编代码中生成的异常检查在哪里?

更新
我知道上面的代码如何转换为 bytecode 。字节码仅将try-catch转换为相应的try-
handler块。我对它将如何转换为jvm进行汇编和/或处理感兴趣。


问题答案:

试捕法的成本

大致来说,tryblock不会向结果程序集中添加任何异常检查代码。只要不引发异常,它基本上是无操作的。所有缓慢的工作都是通过异常引发代码完成的。

如果try-catch是JIT编译的,则 除了 代码外,还会添加一个异常表。它将可能发生已处理异常的地址范围映射到相应异常处理程序的地址。
注意: 这些不是字节码索引,而是实际的内存地址。

HotSpot中如何引发异常?

  1. 隐式异常:NullPointerExceptionStackOverflowError是在响应分段错误时在信号处理程序中检测到的。
  2. ArrayIndexOutOfBoundsExceptionClassCastException等等。相应的检查将内联到已完成数组访问的已编译代码中。
  3. OutOfMemoryError 只要执行线程状态转换(vm-> java或native-> java),就会显式检查从本机代码引发的所有其他异常。
  4. athrow字节码引发的所有用户异常。在快速路径中(当catch存在同一帧中的处理程序时),JIT编译athrow为简单跳转。否则,将发生反优化,并在VM运行时内部完成异常处理。

好吧,“如何在程序集级别捕获异常?”

绝不。
我的意思是,通常不会在程序集级别捕获异常-所有繁重的工作(堆栈移动,处理程序查找,去优化,监视器解锁等)都在VM运行时(即C代码)中完成。



 类似资料:
  • 我有这个密码- 编译器将如何实现这一点。在生成的汇编代码中,对异常的检查实际放在哪里? 更新 我知道上面的代码是如何翻译成字节码的。字节码仅将try-catch转换为相应的try-handler块。我感兴趣的是JVM将如何将其转换为汇编/与或处理。

  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe

  • 问题内容: 以下catch()不被调用: 有没有办法捕获这种异常? 问题答案: 请检查 http://linux.die.net/man/1/gcc中 有一个编译器选项-mcheck-zero-division来处理。 另外,也可以选择安装SIGFPE处理程序,然后将float div乘以0将生成一个’FPE_ZERODIVIDE’ 以来 大多数浮点系统基于IEEE标准,该标准允许除以0。这会根据

  • 其中api为: 带有try/catch得客户端用法: 依赖项的版本为: null null ps.当假客户服务可用时,它可以工作,好的。我只关注例外方面。

  • 我正在尝试创建一个过滤器来处理异常(请参见在JSF中处理未捕获的异常) 我在日志中看到错误: 我做错了什么?