2009-09-30 61 views
6

自從第1天起,我一直在爲此而苦惱。它可能並沒有幫助我已經被很多代碼所包圍,甚至根本不處理錯誤。如何正確處理n層應用程序中的錯誤?

無論如何,我正在使用傳統的n層設計中的WebForms:UI-> BLL-> DAL。通常我所做的(我知道這是不對的)是嘗試/捕獲我的數據操作。如果有一個例外,我只是簡單地將它拋出泡沫。

try 
'db operations 
catch ex as exception 
throw 
finally 
'close connections 
end 

因此,然後它泡到BLL和在那裏我會記錄錯誤的另一個try/catch。現在我想提醒用戶有什麼不對,所以我再次拋出它,這樣它就會冒泡到用戶界面。在用戶界面層面,我會在try/catch中換行,如果出現錯誤,我會向他們顯示一條友好的消息。

你的想法是什麼?我能在這裏做些什麼?

回答

5

據我所知,你有三個嘗試/捕獲 - 每一層的一個:DAL,BLL,UI。

只有當你要對此做些什麼時,才應該抓住它。

從我所瞭解的情況來看,您只需從DAL進行回放即可,因此不需要它。

從BLL中記錄了exeption,這是一個很好的做法,因爲您將能夠收集有關異常的數據以最終改進應用程序。

然後你抓住UI層將異常轉化爲用戶友好的東西。沒關係。

所以我只會擺脫從DAL層的try/catch - 如果你真的沒有做任何事情比重新排除異常。

在某些情況下,在傳遞給UI異常的BLL中添加一個標識符並將其顯示給最終用戶可能很有用,因此如果他們調用支持,支持人員可以將給定的Id與異常關聯服務器的日誌。

可以這樣做,例如,添加Guid或其他對Exception.Data集合有意義且唯一的東西。

+0

但是,如果在DAL中發生錯誤,沒有我不得不關閉,以防止泄漏的連接? – Mike 2009-09-30 12:13:23

+0

只需將連接/命令對象放入使用{}塊 – 2009-09-30 12:22:06

+0

如果您正在使用「使用」語句,則無需顯式**嘗試/捕獲DAL。在封面下方,「使用」將會用try/finally封裝你的連接/命令,並在最後關閉它們。 – 2009-09-30 12:36:12

1

你需要拋出異常和捕獲的UI,就像......在BLL

try 
     { 
      //your code 
     } 
     catch (System.Data.SqlClient.SqlException ex) 
     { 
      if (ex.Number == 547) 
      { 
       throw new Exception("ActiveRecord"); 
      } 
     } 
     finally 
     { 
      MasterConnection.Close(); 
     } 

兒茶素的execption在用戶界面和顯示用戶友好的消息。

if (e.Exception != null) 
    { 
     if (e.Exception.InnerException.Message == "ActiveRecord") 
     { 
      //Show here User freind message 
     } 
    } 
2

與其他答案不同,我會建議從您的用戶界面中刪除try/catch。你的BLL應該捕獲異常,記錄它,然後爲UI提供一些機制來查詢發生了什麼錯誤。

這會導致更清晰的UI代碼,因爲您不必枚舉業務層可能拋出的所有可能異常。您可以簡化UI代碼:

if (businessObject.doSomeOperation == true) { 
    // Do whatever you need to here. 
} else { 
    // output error message from businessobject 
    // something like businessObject.LastErrorMessage(); 
} 
相關問題