-1

起動時に 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;
    }
}
4

1 に答える 1