簡體   English   中英

在 Java 中重新拋出異常而不丟失堆棧跟蹤

[英]Rethrowing exceptions in Java without losing the stack trace

在 C# 中,我可以使用throw; 在保留堆棧跟蹤的同時重新拋出異常的語句:

try
{
   ...
}
catch (Exception e)
{
   if (e is FooException)
     throw;
}

Java中是否有類似的東西(不會丟失原始堆棧跟蹤)?

catch (WhateverException e) {
    throw e;
}

將簡單地重新拋出您捕獲的異常(顯然,周圍的方法必須通過其簽名等來允許這一點)。 異常將保留原始堆棧跟蹤。

我會比較喜歡:

try
{
    ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
    // Note: don't catch all exceptions like this unless you know what you
    // are doing.
    ...
}

您還可以將異常包裝在另一個異常中,並通過將異常作為 Throwable 作為原因參數傳入來保留原始堆棧跟蹤:

try
{
   ...
}
catch (Exception e)
{
     throw new YourOwnException(e);
}

在 Java 中幾乎相同:

try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}

在 Java 中,你只是拋出你捕捉到的異常,所以throw e而不僅僅是throw Java 維護堆棧跟蹤。

像這樣的東西

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}
public int read(byte[] a) throws IOException {
    try {
        return in.read(a);
    } catch (final Throwable t) {
        /* can do something here, like  in=null;  */
        throw t;
    }
}

這是一個具體示例,該方法拋出IOException final意味着t只能保存從 try 塊拋出的異常。 可以在此處此處找到其他閱讀材料。

如果您將捕獲的異常包裝到其他異常中(以提供更多信息),或者您只是重新拋出捕獲的異常,則保留堆棧跟蹤。

try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }

我只是遇到了類似的情況,我的代碼可能會拋出許多我只想重新拋出的不同異常。 上面描述的解決方案對我不起作用,因為 Eclipse 告訴我throw e; 導致未處理的異常,所以我只是這樣做:

try
{
...
} catch (NoSuchMethodException | SecurityException | IllegalAccessException e) {                    
    throw new RuntimeException(e.getClass().getName() + ": " + e.getMessage() + "\n" + e.getStackTrace().toString());
}

為我工作....:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM