当前位置: 首页 > 知识库问答 >
问题:

如何在低(程序集)级别捕获和处理异常?

傅志文
2023-03-14

我有这个密码-

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

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

更新
我知道上面的代码是如何翻译成字节码的。字节码仅将try-catch转换为相应的try-handler块。我感兴趣的是JVM将如何将其转换为汇编/与或处理。

共有1个答案

贝凯
2023-03-14

try-catch块的代价

大致来说,try块不会向结果程序集中添加任何异常检查代码。只要没有抛出异常,它基本上就是一个no-op。所有缓慢的工作都是通过异常抛出代码完成的。

当对try-catch进行JIT编译时,会在代码之外添加一个异常表。它将可能发生已处理异常的地址范围映射到相应异常处理程序的地址。注意:这些不是字节码索引,而是真正的内存地址。

如何在热点中抛出异常?

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

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

 类似资料:
  • 问题内容: 我有此代码- 编译器将如何实际实现这一点。实际在汇编代码中生成的异常检查在哪里? 更新 我知道上面的代码如何转换为 bytecode 。字节码仅将try-catch转换为相应的try- handler块。我对它将如何转换为jvm进行汇编和/或处理感兴趣。 问题答案: 试捕法的成本 大致来说,block不会向结果程序集中添加任何异常检查代码。只要不引发异常,它基本上是无操作的。所有缓慢的

  • 问题内容: 我有一个应用程序,需要编写一个自定义的全局未捕获的异常处理程序。我已经阅读了所有stackoverflow线程,并且其中每个线程都只是缺少一个清晰而简单的示例,说明了如何实现这一点。 考虑以下简单示例: 它抛出一个标准异常,它只是一个标准输出。我如何实现自己的异常,该异常可以通过将错误输出到日志文件中的简单方法覆盖标准异常?显然,实际的应用程序要大得多,我们正在谈论未捕获的异常,这就是

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

  • 我有以下情况,我试图看看是否有解决方案: 两个Spring服务调用必须并行进行(一个是现有的服务调用/逻辑,另一个是新添加的服务调用) 然而,一条快乐的道路应该是直截了当的,当涉及到服务发出的错误时,应该遵守以下规则: > 如果其中只有一个失败,则通过另一个服务(异步)记录错误,并且API只返回成功服务的结果--这可以通过相应的线程来完成。 我的问题是,因为这些服务返回某个对象的列表,即使我使用并

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

  • 问题内容: 因此,在此桌子上,我一直将头撞在桌子上几个小时,而且我什么都没走,因此我们将不胜感激。 下面的代码有两个jquery事件处理程序,它们会触发ajax请求。第一个使用GET,并且从服务器返回的数据是JSON编码的-它工作正常。返回的第二个(“ button#addTx”)使Firebug产生此错误: 未捕获的异常:[异常…“提示被用户终止” nsresult:“ 0x80040111(N