簡體   English   中英

核心庫的例外架構

[英]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對不起,我的英語,順便說一句。

一般做法應如下:

  1. 在異常類型與特定情況匹配的任何情況下,您都可以使用標准.NET異常類(例如ArgumentNullExceptionInvalidOperationException )。 有很多.NET異常類,你需要了解它們才能知道扔哪個以及何時拋出。

  2. 如果錯誤是與Core庫的邏輯嚴格相關的錯誤,則可以定義自己的異常類,然后使用它們引發。

  3. 您可能應該創建一個異常層次結構,其中基本異常類代表常規錯誤,而更具體的異常類則繼承自它們。 例如,您定義的基本異常類可以命名為:ex。 CalculationExcepion 然后定義從其繼承的類-指定特定種類的計算異常。 使用這種方法,您的庫的用戶將能夠捕獲基本異常(以涵蓋許多錯誤情況),或根據他們的偏好處理特定異常。

  4. 您可以在異常中引入其他屬性,但要小心像ErrorCode這樣的屬性最終不會有一個可能有50個不同錯誤代碼的通用異常類 - 這對於Core庫的用戶來說很難處理。 您可以在特定錯誤類型的有限數量的特殊情況下使用ErrorCode這樣的屬性,例如在執行GET請求時獲得的HTTP代碼:200、500、404和其他一些代碼-但仍然數量有限。

  5. 應該記錄您的Core庫中的公共方法和屬性,以了解它們引發什么類型的異常以及何時可以預期到這些異常。

暫無
暫無

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

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