[英]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)
{
...
}
如果您將捕獲的異常包裝到其他異常中(以提供更多信息),或者您只是重新拋出捕獲的異常,則保留堆棧跟蹤。
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.