簡體   English   中英

3層架構中的錯誤處理

[英]Error Handling in 3 layered architecture

如何優雅地實現錯誤處理? 例如,我的數據訪問層可能會拋出兩種類型的錯誤:1)未授權訪問,在這種情況下,頁面應隱藏所有內容,只顯示錯誤消息2)錯誤,告知用戶此類內容已存在於數據庫(例如,名稱不是唯一的 - 例如),在這種情況下,我不想隱藏所有內容。

編輯:

由於這里的一些評論,我設計了我應該創建派生的專用異常類型,例如NotAuthorizedException,DuplicateException等等......它都很好,但是我可以看到2個問題:

1)每個存儲過程都有一個返回字段p_error,其中包含一條錯誤消息。 從DB獲取數據后,我需要檢查此字段以查看已返回的錯誤類型,因此我可以拋出適當的異常。 所以,我仍然需要在某處存儲我的錯誤類型/錯誤消息.....換句話說,我應該如何向用戶發送確切的消息(在某​​些時候我需要),而不是先檢查p_error字段。 什么讓我回到錯誤對象。 任何人?

2)我可能會變成一場噩夢,其中異常的數量等於錯誤消息類型的數量。

我在這里錯過了什么嗎?

非常感謝大家!

您應該檢查Enterprise Library中的異常處理塊。 很多關於包裝異常並在層之間傳遞異常的好技巧和代碼軟件。

您的業​​務層在哪里,為什么不檢查授權和完整性? DAL太低了,無法檢查這些規則 - 如果你遇到問題,那么拋出異常的時候已經快了。 您的業​​務層或控制器可以捕獲該異常,並顯示合理的消息 - 但這不是您應該經常做的事情。

創建自己的異常圖層。

DALExceptionManager DuplicateException DatabaseException

BLLExceptionManager NotAuthorizedException InvalidDateException

在Presentation Layer中,添加此引用並創建一個公共異常處理程序。 通過這種方式,您知道如何處理異常消息。

我正在考慮使用的一個選項是創建一個Error類,但是我需要將它從UI傳遞到業務層,然后通過引用傳遞給數據訪問層

我不確定我明白這一點。 您不必在每個圖層中傳遞錯誤對象。 例如,在您的一個示例中, errors that inform the user that something like this already exists in the database (say name not unique - for example) ,框架可能拋出sql異常,您只需要捕獲業務層或UI層中的特定異常。

其他人建議的企業庫的異常處理塊將允許您在web.config文件中定義一些基於策略的異常處理。 如果你想開發一些企業應用程序,它可能是個好地方。 但是對於簡單的應用程序,您可能不需要那么遠。

上層中發生的事情不在您的數據訪問層。 它甚至不應該知道上層將要做什么。 如果你有一個重復的鍵錯誤,那么它應該拋出類似“DuplicateKeyException”的東西。 如果你應該發出授權錯誤(我認為你的意思是“異常”),那么不要對它做任何事情 - 讓它回到UI層,這可以顯示一個合適的錯誤頁面。

請記住,錯誤狀態值和這些事情是我們發明異常的原因。

正如許多人所指出的那樣,企業庫異常處理塊就是炸彈。 使用策略,您可以執行諸如記錄異常,將其包裝在另一個異常中,拋出新異常而不是原始異常。 此外,如果您希望基於身份驗證錯誤或重復記錄錯誤等執行特定操作,您可以始終創建特定的派生異常類並捕獲這些異常類型,這將排除從頂部向下傳遞任何對象的需要。 例外應該總是冒泡而不是下降。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM