起動時に ThreadException ハンドラーが初期化される非常に大規模で複雑なアプリケーションがあり、アプリケーションによってスローされ、すぐに処理されない例外はすべて、この ThreadException ハンドラーによって統一された方法で処理されます。
これはほとんど機能します...しかし、この例外ハンドラーで処理したいいくつかのカスタム例外タイプがあり、何らかの理由で、これらの例外タイプは常に ThreadException ハンドラーに System.ComponentModel.Win32Exception タイプとして表示されます。カスタムタイプ。
カスタム例外クラスがシリアル化コンストラクターを含むすべての推奨コンストラクターを実装していることを確認するなど、トラブルシューティングのために考えられることはすべて試しました。
追加情報...既存の例外からのメッセージだけで新しい例外を作成すると、これは System.Exception として発生します。例えば:
MSCSqlException msx = new MSCSqlException(sqlQuery, sqlParams, sqlException);
throw new Exception(ex.Message);
正常に動作し、例外ハンドラーで System.Exception としてキャッチされます。
ただし、次のようなことを試してみると:
MSCSqlException msx = new MSCSqlException(sqlQuery, sqlParams, sqlException);
throw new Exception(ex.Message, ex);
次に、例外マネージャーは、System.Exception だけでなく、上記の System.ComponentModel.Win32Exception をキャッチします。
完全を期すために、私がやりたいことは次のようなものです:
throw new MSCSqlException(sqlQuery, sqlParams, sqlException);
Application.ThreadException ハンドラーが適切に型指定された MSCSqlException を受け取るようにします。
これを回避する方法はありますか?カスタム エラー タイプに関連して、私が見逃している Application.ThreadException の癖はありますか?
カスタム例外クラス:
[Serializable]
public class MSCSqlException : Exception
{
public string SqlCommand { get; private set; }
public object[] SqlParameters { get; private set; }
public MSCSqlException()
{
}
public MSCSqlException(string message)
: base(message)
{
}
public MSCSqlException(string message, Exception inner) : base(message, inner)
{
}
public MSCSqlException(string command, object[] parameters, SqlException sx) : base(CreateUsefulMessage(sx, command, parameters), sx)
{
SqlCommand = command;
SqlParameters = parameters;
}
protected MSCSqlException(SerializationInfo info, StreamingContext context) : base(info, context)
{
SqlCommand = info.GetString("SqlCommand");
}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
info.AddValue("SqlCommand", SqlCommand);
base.GetObjectData(info, context);
}
public static string CreateUsefulMessage(SqlException sx, string sqlCommand, object[] sqlParameters)
{
string message = sx.Message + Environment.NewLine;
if(sqlParameters != null && sqlParameters.Count() > 0)
{
message = message + "Parameters:" + Environment.NewLine;
foreach(object sp in sqlParameters)
{
message = message + "\t" + sp.ToString() + Environment.NewLine;
}
}
message = message + "SQL Statement:" + Environment.NewLine;
message = message + sqlCommand;
return message;
}
}