如何使用當地語系化例外狀況訊息來建立使用者定義的例外狀況

在本文中,您將瞭解如何透過使用附屬組件的當地語系化例外狀況訊息,建立繼承自基底 Exception 類別的使用者定義例外狀況。

建立自訂例外狀況

.NET 包含許多您可使用的不同例外狀況。 不過,在某些情況下,當都不符合您的需求時,您可建立自己的自訂例外狀況。

假設您要建立包含 StudentName 屬性的 StudentNotFoundException。 若要建立自訂類別,請依照下列步驟:

  1. 建立繼承自 Exception 的可序列化類別。 類別名稱的結尾應為 "Exception":

    [Serializable]
    public class StudentNotFoundException : Exception { }
    
    <Serializable>
    Public Class StudentNotFoundException
        Inherits Exception
    End Class
    
  2. 新增預設建構函式:

    [Serializable]
    public class StudentNotFoundException : Exception
    {
        public StudentNotFoundException() { }
    
        public StudentNotFoundException(string message)
            : base(message) { }
    
        public StudentNotFoundException(string message, Exception inner)
            : base(message, inner) { }
    }
    
    <Serializable>
    Public Class StudentNotFoundException
        Inherits Exception
    
        Public Sub New()
        End Sub
    
        Public Sub New(message As String)
            MyBase.New(message)
        End Sub
    
        Public Sub New(message As String, inner As Exception)
            MyBase.New(message, inner)
        End Sub
    End Class
    
  3. 定義任何其他屬性和建構函式:

    [Serializable]
    public class StudentNotFoundException : Exception
    {
        public string StudentName { get; }
    
        public StudentNotFoundException() { }
    
        public StudentNotFoundException(string message)
            : base(message) { }
    
        public StudentNotFoundException(string message, Exception inner)
            : base(message, inner) { }
    
        public StudentNotFoundException(string message, string studentName)
            : this(message)
        {
            StudentName = studentName;
        }
    }
    
    <Serializable>
    Public Class StudentNotFoundException
        Inherits Exception
    
        Public ReadOnly Property StudentName As String
    
        Public Sub New()
        End Sub
    
        Public Sub New(message As String)
            MyBase.New(message)
        End Sub
    
        Public Sub New(message As String, inner As Exception)
            MyBase.New(message, inner)
        End Sub
    
        Public Sub New(message As String, studentName As String)
            Me.New(message)
            StudentName = studentName
        End Sub
    End Class
    

建立當地語系化例外狀況訊息

您已建立自訂例外狀況,並可使用如下列的程式碼以在任何位置中擲回例外狀況:

throw new StudentNotFoundException("The student cannot be found.", "John");
Throw New StudentNotFoundException("The student cannot be found.", "John")

上述行的問題在於 "The student cannot be found." 僅是常數字串。 在當地語系化的應用程式中,您想要根據使用者文化特性而有不同訊息。 附屬組件可讓您執行此動作。 附屬組件是包含特定語言資源的 .dll。 當您在執行階段要求特定資源時,CLR 會根據使用者文化特性尋找該資源。 如果找不到該文化特性的附屬組件,則會使用預設文化特性的資源。

若要建立當地語系化的例外狀況訊息:

  1. 建立名為 Resources 的新資料夾以保存資源檔。

  2. 將新的資源檔新增至其中。 若要在 Visual Studio 中執行此動作,請以滑鼠右鍵按一下 [方案總管] 中的資料夾,然後選取 [新增]>[新增項目]>[資源檔]。 將檔案命名為 ExceptionMessages.resx。 這是預設資源檔。

  3. 新增例外狀況訊息的名稱/值組,如下圖所示:

    Add resources to the default culture

  4. 新增法文的新資源檔。 將資源檔命名為 ExceptionMessages.fr-FR.resx

  5. 再次新增例外狀況訊息的名稱/值組,但以法文值進行:

    Add resources to the fr-FR culture

  6. 建立專案之後,組建輸出資料夾應包含 fr-FR 資料夾,其中具有附屬組件 .dll 檔案。

  7. 您可使用如下的程式碼以擲回例外狀況:

    var resourceManager = new ResourceManager("FULLY_QUALIFIED_NAME_OF_RESOURCE_FILE", Assembly.GetExecutingAssembly());
    throw new StudentNotFoundException(resourceManager.GetString("StudentNotFound"), "John");
    
    Dim resourceManager As New ResourceManager("FULLY_QUALIFIED_NAME_OF_RESOURCE_FILE", Assembly.GetExecutingAssembly())
    Throw New StudentNotFoundException(resourceManager.GetString("StudentNotFound"), "John")
    

    注意

    如果專案名稱為 TestProject 和資源檔案 ExceptionMessages.resx 位於專案的 Resources 資料夾中,則資源檔的完整名稱為 TestProject.Resources.ExceptionMessages

另請參閱