Out團隊正在構建一個可處理大量數據庫和網絡方法的N層應用程序。N層/ N層錯誤處理設計
基本上,我們設計了下面的層(從下到上):
數據層:可以是Oracle或SQL(基本上是一個EF實體和上下文自動生成的使用數據庫前) 持久性層:處理數據層。我們有一個Oracle的持久層和另一個SQL層,它們之間有一些細微的變化(我們希望重申,將來有一個代碼 - 接受想法)。 業務層:這是處理特定的應用程序邏輯。
在此之上,我們可以有一個表示層(ASP.NET應用程序),一個直接調用業務功能的API,一個允許來自網絡的業務請求的網絡代理等等。
我們對錯誤處理機制有懷疑。我們決定所有的異常都是在業務層面上進行威脅,所以這是唯一一個有try/catch語句的地方。
我們的觀點是我們不希望應用程序用戶擺脫異常,但他們需要知道操作的狀態。我們創建了一個ReturnStatus類,看起來像:
public class ReturnStatus
{
public enum ReturnStatusTypes : int { Success, Failure, Unknown }
public ReturnStatusTypes Status;
public int MessageCode;
public string Message;
/// <summary>
/// Class constructor
/// </summary>
public ReturnStatus()
{
Status = ReturnStatusTypes.Unknown;
MessageCode = 0;
Message = "";
}
/// <summary>
/// Class constructor
/// </summary>
/// <param name="status">Status</param>
/// <param name="message">Message</param>
public ReturnStatus(ReturnStatusTypes status, int msgCode)
{
Status = status;
MessageCode = msgCode;
Message = ErrorMessages.ResourceManager.GetString("ErrorCode" + msgCode);
}
}
Message屬性取決於應用程序的文化之前設置的本地化。
我們希望對業務層方法的每次調用都有一個ReturnStatus。這可以記錄到ASP.NET狀態欄,返回到API或通過網絡發送到其他應用程序。問題是我們的大多數業務類都會返回數據,所以我們需要找到一種方法將狀態和數據一起返回給消費角色。
我們的工作人員正在考慮: a)在每次通話中使用元組。這不是推薦的方式。 b)拋出一個期望:不符合我們的架構。 c)在每次通話中使用ReturnStatus:考慮一個選項,甚至看起來老式。 d)將最後一個錯誤對象保存在某個地方,因此調用可以直接返回數據,用戶可以調用lastactionstatus來獲取此錯誤。我們的觀點是:我們不知道在哪裏存儲最後的錯誤數據。在單身課上?
解決方案必須在所有業務方法之間保持一致。
對於最佳方法以及如何實現它,你會推薦什麼?
我們知道如何處理異常。這不是問題或問題。我們的問題是關於我們應該在用戶層使用什麼方法,因爲我們不想傳播異常處理程序。 – Mendes
我想知道是否這個gona工作你必須檢查stauts每次這是一個非常古老的編程風格和最C和C++程序員仍然在嵌入式系統中使用它。我強烈建議你在你的架構中重新設置異常處理,否則你將永遠無法獲得這個系統的穩定性,或者我錯過了一些東西,因爲我沒有軟件中的源代碼和整個錯誤處理工作流程,只是感覺。 –
同意。返回碼只是感覺不對。我沒有發現讓層之間出現異常的問題。你遇到了返回代碼的問題 - 因爲你返回一個代碼,你不能返回數據,所以你的方法需要你'out'或'ref'。讓異常發生並在最後一層適當地處理它們。 –