2011-07-18 82 views
0

只是用企業庫4.0來處理異常處理塊。我的應用程序是一個具有DAL,BLL和UI的asp.net應用程序。在asp.net中的異常處理

當發生異常時,我想記錄DAL(sp,params,exception),BLL(用戶,角色等)和UI(會話內容)中包含的相關場景/上下文。現在我想我需要用字典創建一個自定義異常。當在DAL中發生異常時,我會在每個圖層的相關數據中填充詞典作爲異常冒泡。最後,我將它記錄在App_Error上。

Web上的示例建議將其記錄在DAL本身,然後傳播。我們在BLL,UI層上如何處理這種傳播異常?這是否意味着,它與保存上下文相同,但每一層本身都記錄相關數據。然後在日誌中,我們需要關聯每個層的日誌語句以創建上下文。

請建議...

+2

你就不能使用內部異常並讓它表明層的變化? – faester

回答

1

在所有的解決方案,我實現了這個本質常識通常決定了你簡單地從DAL報告錯誤。

通過事務性地執行任何數據庫更改,您將確保執行回滾,並用您自己的實際例外來說明發生了內部異常,並且因此未做任何更改。

在BLL中,異常然後被捕獲,然後作爲調用應用程序的自定義「BusinessProcessException」拋出。可選地,BLL因爲它在它自己的「盒子」中,所以有時它有自己的記錄機制來記錄與業務流程有關的異常。

天氣已記錄或不在BLL層,您仍然需要通知UI層(客戶端應用程序)發生異常並記錄回傳完整的異常樹。

UI層中的客戶端應用程序代碼可能有自己的日誌,但不會是BLL使用的日誌。

事件週期是這樣的......

應用程序調用BLL方法 BLL方法調用DAL方法 分貝的 存儲過程中的錯誤拋出(例如)SQL異常 DAL拋出存儲過程的DAL方法調用以sqlexception爲內部的新dal異常 bll處理dal異常和日誌dal失敗 如果調用的bll方法存在某些事務元素,則bll將回滾其他調用。 bll拋出新的bll框架異常內部是dal異常 應用程序處理bll異常並決定如何處理來自完整異常樹的用戶體驗。

這幾乎是所有.net的作品。

注意事項:

如果我失敗的更新呼叫的業務對象,該業務對象可能有被更新爲呼叫的一部分幾個子對象。 這些子對象可以從不同的服務器上的多個DAL端點進行組裝和每個DAL端點可能有潛在的幾個分貝的

所以,你必須爲每個DAL BLL層邏輯和1交易調用內部運作來更新多個記錄,然後在每個存儲的proc調用中可能有1個。

.net在後臺執行的操作是以這樣一種方式堆棧,即如果bll級別的事務失敗並且調用了回滾,它應該回滾所有的子事務,但是在現實世界中事務跨越系統並且經常網絡這可能是不可能的。

因此,您必須假設您採取的操作可能會失敗,並且如果任何部分的失敗都會失敗,並且代碼調用對此負責。

這最終意味着什麼,你需要一個完整的審計跟蹤發生了什麼。 作爲一個bll開發我記錄我的框架無論如何做的一切,sql也有事務日誌,所以在這方面簡化了很多dal實現。

應用程序具有(對於asp.net)服務器日誌或僅限自定義選項。

我會推薦的唯一的事情是,每一層記錄自己的活動和日誌分開(例如,一個用戶界面相關的錯誤是不是真的東西,在BLL日誌所屬)

+0

+1這裏很好的建議,儘管我通常不會爲DAL設置單獨的日誌,因爲它通常是由BLL驅動的。 – akmad

+0

我同意我傾向於依靠sql自己的事務日誌...但是,如果你不使用sql後端,並需要執行操作的審計跟蹤bll日誌不會總是給你一個清晰的圖片(取決於設計和規模)...所以我喜歡覆蓋所有的基地。當你遇到問題時,你會得到所有關於數據的數據! – War