web-dev-qa-db-ja.com

ベースコンストラクターに渡さずにカスタム例外のメッセージを設定する

C#でカスタムExceptionを作成したいのですが、理論的には、人間が読めるExceptionMessageを作成する前に、まず少し解析する必要があります。

問題は、元のメッセージはMesssageの基本コンストラクターを呼び出すことによってのみ設定できるため、事前に解析を行うことができないことです。

私は次のようにMessageプロパティを上書きしようとしました:

public class CustomException : Exception
{
    string _Message;

    public CustomException(dynamic json) : base("Plep")
    {
        // Some parsing to create a human readable message (simplified)
        _Message    = json.message;
    }

    public override string Message
    {
        get { return _Message; }
    }
}

問題は、Visual Studioデバッガーが、コンストラクターに渡したメッセージPlepを引き続き表示することです。

throw new CustomException( new { message="Show this message" } )

結果:

Visual Studio Exception Dialog

基本コンストラクターを空のままにすると、非常に一般的なメッセージが表示されます。

App.exeで「App.CustomException」タイプの未処理の例外が発生しました

質問

例外ダイアログは、私もアクセス権のないフィールド/プロパティを読み取るようです。例外の基本コンストラクタの外側に人間が読めるエラーメッセージを設定する他の方法はありますか?.

Visual Studio 2012を使用していることに注意してください。

48
Dirk Boer

書式設定コードを静的メソッドに入れるだけですか?

public CustomException(dynamic json) : base(HumanReadable(json)) {}
private static string HumanReadable(dynamic json) {
    return whatever you need to;
}
86
Sebastian Redl

新しい例外を作成するためのMicrosoftガイドラインを考慮してください。

  using System;
  using System.Runtime.Serialization;

  [Serializable]
  public class CustomException : Exception
  {
    //
    // For guidelines regarding the creation of new exception types, see
    //    https://msdn.Microsoft.com/en-us/library/ms229064(v=vs.100).aspx
    //

    public CustomException()
    {
    }

    public CustomException(string message) : base(message)
    {
    }

    public CustomException(string message, Exception inner) : base(message, inner)
    {
    }

    protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context)
    {
    }

    public static CustomException FromJson(dynamic json)
    {
      string text = ""; // parse from json here

      return new CustomException(text);
    }
  }

次のようにプログラムで使用できる静的なファクトリメソッド(パターンの一部ではない)に注意してください。

throw CustomException.FromJson(variable);

そうすれば、ベストプラクティスに従って、例外クラス内のJSONを解析できます。

15
nvoigt

問題はVisual Studioデバッガーにあると思われます。デバッガーを使用して取得したのと同じ結果が得られましたが、代わりにメッセージを出力すると:

class CustomException : Exception {
    public CustomException(dynamic json)
        : base("Plep") {
            _Message = json.message;
    }

    public override string Message {
        get { return _Message; }
    }

    private string _Message;
}

class Program {
    static void Main(string[] args) {
        try {
            throw new CustomException(new { message = "Show this message" });
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

予想通りに_"Show this message"

例外がキャッチされる場所にブレークポイントを配置すると、デバッガーは正しいメッセージを表示します。

7
Ferruccio

ここで使用したいです。それは簡単で、静的関数を必要としません:

public class MyException : Exception
{
    public MyException () : base("This is my Custom Exception Message")
    {
    }
}
2
Simons0n

このようなものの何が問題なのでしょう。

    public class FolderNotEmptyException : Exception
{

    public FolderNotEmptyException(string Path) : base($"Directory is not empty. '{Path}'.")
    { }

    public FolderNotEmptyException(string Path, Exception InnerException) : base($"Directory is not empty. '{Path}'.", InnerException)
    { }

}

文字列を使用し、パラメータを含めるだけです。シンプルなソリューション。

1
Kieran Foot