2009-02-17 44 views
9

什麼是處理ASP.NET Webforms中的異常的首選方法?ASP.NET Webforms中的異常處理

您在web.config級別添加了(我認爲)Page_Error方法,並且發生錯誤時整個站點都會重定向到那裏。

這是否意味着你不應該在webforms應用程序的任何地方使用try-catch? (假設你不想隱藏任何錯誤)

回答

12

只捕獲你可以處理的錯誤。如果您可以通過允許頁面繼續加載的方式來處理它們,那麼請執行此操作。任何其他會破壞頁面的異常都不應該在任何控件或頁面中處理,因爲無論如何您都無法做任何事情。讓它轉到global.asax處理程序並確保您記錄異常。

0

你應該在你可以做一些有意義的錯誤的地方使用try/catch,比如修復它或採取不同的方法。

對於所有其他情況,您應該使用全局try/catch使用web.config自定義錯誤頁面或Application_Error事件來記錄錯誤並可能將其顯示給用戶。

4

除了Andrew的建議,請確保更新web.config文件以將CustomErrors設置爲「On」並指定一個通用錯誤頁面以重定向這些頂級錯誤。 Global_asax仍會記錄錯誤,然後用戶可以看到一個友好的頁面。它也可以讓你配置一些標準類型的錯誤,比如404s和200s,等等。

0

如果您使用驗證控件或在您的代碼中檢查並驗證用戶輸入,那麼這將大大防止錯誤。我建議有一個通用的錯誤頁面,可以記錄你的錯誤。如果您不確定會發生什麼,我建議您抓住錯誤並儘可能地處理它,並努力找到一種方法來知道您要在運行之前運行哪些內容。

你是否有一個具體的例子記住你可能會遇到這種錯誤的地方。我知道的一個情況是會話過期並且不能再處理頁面。我在運行其他任何程序之前檢查每個頁面的加載情況,然後在發生此情況時重定向用戶。

2
  • Web應用程序通常由用戶界面,業務和數據訪問層組成。每個層都必須完成其關於異常處理的部分。每個層必須(爲了代碼可用性)檢查錯誤情況幷包裝異常(記錄之後)並可能傳播到調用層。 UI層應該隱藏異常並顯示友好的消息。捕捉用戶界面中的所有異常可能不是一個好主意。如果可能,應該在數據庫中記錄異常。這樣可以便於維護和糾正錯誤

  • 儘量避免捕捉異常。在使用它們之前嘗試並驗證所有輸入。在驗證控制的幫助下,嚴格的驗證(客戶端和服務器端)輸入,自定義控件和正則表達式是必須的。

    string fname = "abc"; 
    //Always check for condition, like file exists etc... 
    if (System.IO.File.Exists(fname)) 
    { 
    
    } 
    else 
    { 
    
    } 
    
  • 務必確保清理代碼被調用。最後使用聲明或嘗試。

  • 您可以捕獲Global.asax中的所有異常(asp。淨應用程序文件)

    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs 
        Exception objErr = Server.GetLastError().GetBaseException(); 
        string err = "Error Caught in Application_Error event\n" + 
         "Error in: " + Request.Url.ToString() + 
         "\nError Message:" + objErr.Message.ToString()+ 
         "\nStack Trace:" + objErr.StackTrace.ToString(); 
        EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error); 
        Server.ClearError(); 
        //additional actions... 
    
    } 
    

,並在你的web配置添加<customerror>部分用戶重定向到一個單獨的頁面

<customErrors defaultRedirect="error.htm" mode="On"> 
    </customErrors>