【業務邏輯異常和執行異常】
對於異常我們只分業務邏輯異常(不符合業務規則的異常)和執行異常(系統自己的異常,比如什麼conn出錯,某某dll缺少依賴)
業務規則異常自己繼承實現一個mylogic異常類就行,無論你是什麼dal,你對業務部分異常都拋這個就成
執行異常通常不用管直接寫入log4net中,以便維護人員排查錯誤

異常你得分開來看,
一種是可預見異常,簡單的例子就是除0啊強轉啊導致的,這裡異常不但不應該丟擲反而應該在邏輯層就被排除掉。
另一種是不可預見的異常,比如資料庫連線在執行時突然斷了,這類異常完全和邏輯無關,所以放邏輯層處理顯然不合適,必須記錄日誌,可能的話要通知相關人員。

☆☆☆☆☆
異常可以分為系統異常和業務異常,業務異常必須被轉化為業務執行的結果
DataAccess層不得向上層隱藏任何異常
要明確區分業務執行的結果和系統異常。比如驗證使用者的合法性,如果對應的使用者ID不存在,不應該丟擲異常,
而是返回(或通過out引數)一個表示驗證結果的列舉值,這屬於業務執行的結果。但是,如果在從資料庫中提取使用者資訊時,資料庫連線突然斷開,則應該丟擲系統異常
BL層應根據業務的需要捕獲某些系統異常,並將其轉化為業務執行的結果
UI層除了從呼叫BL層的API獲取的返回值來檢視業務的執行結果外,還需要截獲所有的系統異常,並將其解釋為友好的錯誤資訊呈現給使用者
一般使用log4net實現日誌記錄和自定義異常處理

【結論和規範】
只在業務層記錄錯誤,資料層只是丟擲