一千萬個為什麽

搜索

在Java中提取用戶友好的異常詳細信息

我有一個我正在處理的J2EE Web應用程序,當發生異常時,我想獲得有關異常的一些基本細節並記錄它。我正在記錄的消息應該是非常基本的,這可能對運行Web服務器的人有意義。

使用 e.getMessage()是最好的記錄嗎?謝謝。

最佳答案

我做了一些非常相似的事情。但首先,您根本不需要將錯誤傳達給用戶。告訴他們錯誤是如何發生的,因為無論如何你都要記錄它。 (如果用戶知道由於NPE或IO錯誤而發生錯誤,即使您將其重命名為更“友好”的術語,這是否有意義?)

首先,您可能需要考慮重新拋出所有例外情況運行時(未選中)例外。這將強制集中和一致地記錄錯誤。否則,您將不得不希望錯誤處理代碼的每個實例都能正確記錄它。要重新拋出SQLExceptions,例如:

    try{
        conn.close();
    } catch(SQLException ex){
        //logger.error("Cannot close connection"); //don't log this here, do it centrally
        throw new RuntimeException(ex);
    }

您需要將用戶轉發到一般錯誤頁面,只是告訴他們發生了錯誤。這向他們表明他們所做的一切都沒有得到處理。這非常重要,因此他們不會反擊並繼續嘗試一次又一次地輸入付款。讓他們知道出現問題以及(a)聯系服務臺或(b)將表單放在默認錯誤頁面中,該頁面可以記錄故障單或向服務臺發送電子郵件。要完成此任務,您需要在web.xml中定義它:


  500
  /Error.jsp

接下來,在error.jsp頁面(或servlet)內部,如果容器允許您將堆棧跟蹤引用為 request.getAttribute(“javax.servlet.error.message”)),則在此處記錄錯誤;

OR, create a filter that acts only on the response, and like the following:

try {
    chain.doFilter(req, res);
 } catch (Exception e) {
    logger.error("pass any Mapped Diagnostic Context here", e); //log here, centrally
    throw new RuntimeException(e); //throws back to the container so that the error page will be seen
}

這將捕獲所有傳播的異常(未經檢查和未被捕獲),記錄它們,然後重新拋出它們以便它們調用錯誤頁面。這將導致錯誤報告

  1. 準確(每個錯誤實例一個日誌)
  2. 可靠(如果用戶收到錯誤,則會收到記錄詳細信息
  3. 一致(標準化,如果您實施重新拋出已檢查的異常未經檢查,您將能夠看到所有異常,並且還可以阻止用戶進入容易出錯的區域,因為他們插入垃圾,您可能面臨災難性數據清理任務的風險進入表格或左表未填充的關鍵表)

最後,您可能需要考慮使用log4j並使用輸出到某處的appender來查看錯誤,而無需等待操作團隊將它們發送給您。如果您經常維護應用程序,那麽就更容易了。

轉載註明原文: 在Java中提取用戶友好的異常詳細信息