java - 在 Java 中重新抛出异常时未完全维护堆栈跟踪

标签 java jakarta-ee exception-handling

<分区>

当在下面的代码中重新抛出异常时,不会保留原始堆栈跟踪。

异常在第 148 行抛出并在第 150 行重新抛出。在重新抛出之后,第 150 行是指定的异常源。

我必须怎么做才能保留原始堆栈跟踪?

代码:

    try {

        content = (InputStream) conn.getContent(); //line 148

    } catch (IOException e) {

        throw new RuntimeException(e); //line 150

    }

原始堆栈跟踪:

 (java.lang.StackTraceElement[]) [sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source), java.net.URLConnection.getContent(Unknown Source), com.mycompany.myapp.client.services.impl.AbstractClientService.getResponseEle(AbstractClientService.java:148), com.mycompany.myapp.client.services.impl.AbstractClientService.getResponseEleWithCheck(AbstractClientService.java:162), com.mycompany.myapp.client.services.impl.AbstractClientService.getResponseEleWithCheck(AbstractClientService.java:158), com.mycompany.myapp.client.services.impl.InfoQueryClientServiceImpl.getFileOnTmpList(InfoQueryClientServiceImpl.java:84), com.mycompany.myapp.client.myappClient.getFileOnTmpList(myappClient.java:196), com.mycompany.myapp.client.model.Model.updateStudyInfos(Model.java:96), com.mycompany.myapp.client.model.Model.instantiateSingleton(Model.java:46), com.mycompany.myapp.applet.MainApplet.addMainPanel(MainApplet.java:106), com.mycompany.myapp.applet.MainApplet.createUIPanel(MainApplet.java:76), com.mycompany.myapp.applet.MainApplet.init(MainApplet.java:58), com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source), sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source), java.lang.Thread.run(Unknown Source)]

重新抛出后的堆栈跟踪:

 (java.lang.StackTraceElement[]) [com.mycompany.myapp.client.services.impl.AbstractClientService.getResponseEle(AbstractClientService.java:150), com.mycompany.myapp.client.services.impl.AbstractClientService.getResponseEleWithCheck(AbstractClientService.java:162), com.mycompany.myapp.client.services.impl.AbstractClientService.getResponseEleWithCheck(AbstractClientService.java:158), com.mycompany.myapp.client.services.impl.InfoQueryClientServiceImpl.getFileOnTmpList(InfoQueryClientServiceImpl.java:84), com.mycompany.myapp.client.myappClient.getFileOnTmpList(myappClient.java:196), com.mycompany.myapp.client.model.Model.updateStudyInfos(Model.java:96), com.mycompany.myapp.client.model.Model.instantiateSingleton(Model.java:46), com.mycompany.myapp.applet.MainApplet.addMainPanel(MainApplet.java:106), com.mycompany.myapp.applet.MainApplet.createUIPanel(MainApplet.java:76), com.mycompany.myapp.applet.MainApplet.init(MainApplet.java:58), com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source), sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source), java.lang.Thread.run(Unknown Source)] 

最佳答案

您的代码不会重新抛出原始异常,但会抛出 RuntimeException 的新实例,该实例的堆栈跟踪在创建时已填充。

当你捕获 RuntimeException 或者 在抛出 RuntimeException 之前,将 RuntimeException 的堆栈跟踪设置为原始异常之一。

关于java - 在 Java 中重新抛出异常时未完全维护堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13395737/

相关文章:

java - 如何向服务器正确验证 AngularJS 客户端

objective-c - 由于 Objective-C 中的异常,我应该如何处理可能的内存泄漏?

objective-c - 使用异常处理程序捕获iOS中低内存崩溃的统计信息

java - Gson 通过对象模型解析文本/纯文本不会隔离字段,而是打印所有字段

java - 将 PDF/A-1b 转换为 PDF/A-2

java - JPA 2 (EclipseLink) 尝试使用 UUID 作为主键 EntityManager.find() 总是抛出异常(数据库是 PostgreSQL)

exception-handling - 在 D 中捕捉的替代方法?

Java老年代一直在增长,直到Tomcat重启

java - Android 上 DOM API 的替代方案?

java - 在 hibernate 中检索子属性时出错