ローカライズされた例外メッセージを使用するユーザー定義の例外を作成する方法

この記事では、サテライト アセンブリを使用してローカライズされた例外メッセージ使用する、基底の 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. プロジェクトをビルドすると、ビルド出力フォルダーには、サテライト アセンブリである .dll ファイルを含む fr-FR フォルダーが作成されます。

  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 です。

関連項目