最近幾年在做項目過程中發現項目中出現的問題,一部分由於項目前期一些很基礎的技術系統沒有註意, 所以總結了項目開始搭建架構的時候應該註意的技術問題和技術框架的選型。 所有所謂的最佳實踐只是參考,本文也不例外。 異常處理是程式最基本的問題,我見過最多的處理異常的方式,在業務層一個大的try catch) ...
最近幾年在做項目過程中發現項目中出現的問題,一部分由於項目前期一些很基礎的技術系統沒有註意, 所以總結了項目開始搭建架構的時候應該註意的技術問題和技術框架的選型。
所有所謂的最佳實踐只是參考,本文也不例外。
異常處理是程式最基本的問題,我見過最多的處理異常的方式,在業務層一個大的try catch):
public static Customer GetCustomer(string account, string password) { try { using (IDbConnection dbConnection = ConnectionFactory.CreateConnection()) { string sql = "select * from Customer where Account=@account and Password=@password and IsDisabled=0"; return dbConnection.Query<Customer>(sql, new { account, password }).FirstOrDefault(); } } catch(Exception ex) { LogHelper.Current.Error("Application_Error", exception); return null; } }
所有的業務邏輯都包裹一層try..catch ,這種方式有倆種壞處:
1.程式異常後應向上拋出業務層請應自動終止,而不是繼續執行,繼續執行會造成臟數據。
2.忘記try catch就無法捕獲異常,線上環境找不到問題所在。
3.每次上層調用都需要加if(var==null)判斷,每次都得想著真浪費時間。
比較好的方式應去除顯示try catch代碼,異常由Application_Error統一處理(如果異常後業務需要重試操作例外),需註意以下幾點:
1.增加處理開關,如果是本地環境無需處理異常,直接報黃頁,這樣方便調試錯誤(Request.IsLocal可以判斷是否是本地請求)。
2.如果404的異常,不用處理。
3.記錄完成異常後,需將請求導向錯誤頁面。
protected void Application_Error(Object sender, EventArgs e) { if (Environment.IsLocal()) { return; } var exception = Server.GetLastError(); //不處理404異常 var httpException = exception as HttpException; if (httpException != null && httpException.GetHttpCode() == 404) { return; } if (exception != null) { LogHelper.Current.Error("Application_Error", exception); //導向錯誤頁面 Response.Clear(); Response.StatusCode = 500; Response.Write("系統出現了異常,請重試"); Response.End(); } }