2012-12-11 78 views
4

是否有意義拋出catch塊的異常來記錄消息,以便我們確定是什麼導致異常?在catch塊中重新拋出異常是否有意義?

代碼

public void saveLogs(Logs logs) throws RemoteException 
    { 
     try 
     { 
      LogsOps.saveLogs(logs); 
     } 
     catch (RemoteException e) 
     { 
      log.info("RemoteException is thrown while trying to save logs ", e); 
      throw new RemoteException("RemoteException caused while trying to save", e); 
     } 
    } 

針對低於一個評論此方法會拋出異常計算器,這裏實際執行log.info這只是顯示這些錯誤。

 /** Log the message and the exception with a level of INFO. 
    * @param message - The message text. 
    * @param t - An exception to display. 
    */ 
    public void info(Object message, Throwable t) 
    { 
     String nullSafeMessage = (message != null) ? message.toString() : t.getClass().getSimpleName(); 
     log.info(nullSafeMessage, t); 
    } 

因此,不會出現Stackoverflow異常。

+0

堆棧跟蹤是否包含原點和消息應儘可能描述以避免這種情況。但我很少看到它完成。除非沒有其他記錄。 – jn1kk

+0

你實際上記錄了日誌引發的異常?這將是StackOverFlow異常! – Mukus

+0

@TejaswiRana:我沒有看到它拋出StackOverFlow異常,你爲什麼會拋出堆棧溢出異常?,看到我更新的問題。 – Rachel

回答

9

這取決於將會發生什麼事情來捕捉更高的異常。如果沒有其他將登錄信息,然後肯定的是,這是有道理的 - 儘管我可能會再次引發,而不是創建一個新的例外:

catch (RemoteException e) 
{ 
    log.info("RemoteException is thrown while trying to save logs ", e); 
    throw e; 
} 

理想的情況是,你」 d有一個單一的catch塊,堆疊高一些,這將會適當地記錄 - 如果你是只是記錄異常,它可以得到所有的信息。

可能有意義趕上/日誌/重新拋出當你想記錄哪些存在異常,如參數值的信息。

+0

同意,但在我的情況下,我捕獲異常更高的通用日誌消息,但我想捕獲特定的消息,爲什麼和什麼時候當前的RemoteException被拋出,以便它可以更容易從調試應用程序的角度來看,當我們有一些問題與它。 – Rachel

+0

@Rachel我知道的任何該死的記錄器都會打印方法名稱和類名,所以你不需要特定的信息。如果你只想打印消息並繼續前進,你也可以使用'Exception.getMesssage'。 –

3

假設你最終將處理傳播的異常,這種catch-log-rethrow策略會使日誌文件變得混亂。想象一下,這是在堆棧跟蹤的整個過程中完成的 - 最終會產生大量冗餘錯誤信息,這些信息毫無用處。

如果你沒有處理異常,你不應該記錄它。

0

除了日誌記錄之外,這種方法也可用於在發生故障時執行必要的清理操作,然後將控制權返回棧中的調用方。

例如

InputStream is = new InputStream(...) 

try { 

    is.read(...); 

    return is; 

} catch (IOException ioe) { 
    is.close(); 
    throw ioe; 
} 

這是,當然,有些特殊用途可以優雅通過使用finally子句避免大部分的時間 - 但不總是,如上述的情況下展示。