[英]Exceptions architecture for core library
我目前正在開發一個項目,分成幾個部分,核心,UI等。直到很難改變項目架構,我想知道在核心庫中使用異常的最佳方法是什么? 我的意思是,如何組織這些例外? 例如,我可以使用有意義的消息引發系統異常:
// Database implementation within Core library
class Database
{
void Foo()
{
// ...
if (Something())
throw new InvalidDataException(message:"The something!");
else
throw new InvalidDataException(message:"It's not something!");
}
}
class UI
{
void ShowDatabase()
{
var database = new Database();
try
{
database.Foo();
}
catch (InvalidDataException e)
{
CleanUp();
MessageBox.Show(e.ToString());
}
}
}
但是Core庫不必以任何方式與用戶打交道。 我對嗎? 好的,有另一種方式。 我可以將帶有錯誤代碼的系統異常作為異常消息拋出,以便UI層可以為用戶自己選擇警告消息:
static class ErrorCode
{
static string Something = "SomethingOccur";
static string NotSomething = "NotSomethingOccur";
}
class Database
{
void Foo()
{
// ...
if (Something())
throw new InvalidDataException(message:ErrorCode.Something);
else
throw new InvalidDataException(message:ErrorCode.NotSomething);
}
}
class UI
{
void ShowDatabase()
{
var database = new Database();
try
{
database.Foo();
}
catch (InvalidDataException e)
{
if (e.Message == ErrorCode.Something)
{
CleanUpSomthing();
MessageBox.Show(Resources.SomethingMessage);
}
else if (e.Message == ErrorCode.NotSomething)
{
CleanUpSomethingElse();
MessageBox.Show(Resources.NotSomethingMessage);
}
}
}
}
現在它更靈活,但e.Message == ErrorCode.Something
看起來很丑,我想。 還有第三種方法,分別為任何案例實施例外:
class SomethingException : Exception
{
public SomethingException(string message = null, Exception inner = null) : base(message, inner) { }
}
class NotSomethingException : Exception
{
public NotSomethingException(string message = null, Exception inner = null) : base(message, inner) { }
}
class Database
{
void Foo()
{
// ...
if (Something())
throw new SomethingException()
else
throw new NotSomethingException();
}
}
class UI
{
void ShowDatabase()
{
var database = new Database();
try
{
database.Foo();
}
catch (SomethingException e)
{
CleanUpSomething();
MessageBox.Show(Resources.SomethingMessage);
}
catch (NotSomethingException e)
{
CleanUpSomethingElse();
MessageBox.Show(Resources.SomethingMessage);
}
}
}
它看起來更好,但每個案例在某個時刻會有數百個例外。 聽起來不好
所以,問題是 - 處理核心庫中異常的最佳方法是什么? 也許有什么最佳做法?
PS對不起,我的英語,順便說一句。
一般做法應如下:
在異常類型與特定情況匹配的任何情況下,您都可以使用標准.NET異常類(例如ArgumentNullException
, InvalidOperationException
)。 有很多.NET異常類,你需要了解它們才能知道扔哪個以及何時拋出。
如果錯誤是與Core庫的邏輯嚴格相關的錯誤,則可以定義自己的異常類,然后使用它們引發。
您可能應該創建一個異常層次結構,其中基本異常類代表常規錯誤,而更具體的異常類則繼承自它們。 例如,您定義的基本異常類可以命名為:ex。 CalculationExcepion
。 然后定義從其繼承的類-指定特定種類的計算異常。 使用這種方法,您的庫的用戶將能夠捕獲基本異常(以涵蓋許多錯誤情況),或根據他們的偏好處理特定異常。
您可以在異常中引入其他屬性,但要小心像ErrorCode
這樣的屬性最終不會有一個可能有50個不同錯誤代碼的通用異常類 - 這對於Core庫的用戶來說很難處理。 您可以在特定錯誤類型的有限數量的特殊情況下使用ErrorCode
這樣的屬性,例如在執行GET請求時獲得的HTTP代碼:200、500、404和其他一些代碼-但仍然數量有限。
應該記錄您的Core庫中的公共方法和屬性,以了解它們引發什么類型的異常以及何時可以預期到這些異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.