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" } )
結果:
基本コンストラクターを空のままにすると、非常に一般的なメッセージが表示されます。
App.exeで「App.CustomException」タイプの未処理の例外が発生しました
質問
例外ダイアログは、私もアクセス権のないフィールド/プロパティを読み取るようです。例外の基本コンストラクタの外側に人間が読めるエラーメッセージを設定する他の方法はありますか?.
Visual Studio 2012を使用していることに注意してください。
書式設定コードを静的メソッドに入れるだけですか?
public CustomException(dynamic json) : base(HumanReadable(json)) {}
private static string HumanReadable(dynamic json) {
return whatever you need to;
}
新しい例外を作成するための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を解析できます。
問題は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"
。
例外がキャッチされる場所にブレークポイントを配置すると、デバッガーは正しいメッセージを表示します。
ここで使用したいです。それは簡単で、静的関数を必要としません:
public class MyException : Exception
{
public MyException () : base("This is my Custom Exception Message")
{
}
}
このようなものの何が問題なのでしょう。
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)
{ }
}
文字列を使用し、パラメータを含めるだけです。シンプルなソリューション。