4

例外が発生するたびに例外情報をログに記録するエンタープライズアプリケーションがあります。このアプリケーションは、C#とC++。netを組み合わせたものです。

例外発生時にできるだけ多くの情報を入手したい。現在のところ、メッセージとスタックトレースのみを出力します(デバッグビルドでは行番号が表示されますが、リリースは表示されません)。

エラーログの目的は、エラーを可能な限り(可能な限り近くで)指摘することです。どうすればこれをさらに進めることができるのか興味がありますか?もっと情報が欲しい。

たとえば、NullReferenceExceptionsとInvalidArguementExceptionsには異なる量の情報が含まれていることは知っていますが、「メッセージ」フィールド以外は利用していません。

リフレクションを使用し、すべての公開メンバーをキャプチャして印刷するのが最善の策ですか?それとも、大量のタイプチェックとキャストをチェーンして、それらをきれいに印刷しますか?制約として、私のロギング関数は、Exception型の引数を受け取る必要があります。

4

3 に答える 3

11

一般に、答えはex.ToString()をログに記録することです。一般に、オブジェクトのToStringメソッドは、オブジェクトが知ってほしいことを表示します。基本Exceptionクラスの場合、これには、InnerExceptionインスタンスの場合と同じことに加えて、メッセージとスタックトレースが含まれます。例外の特定の派生クラスは、より多くの情報を表示する場合があります。

SqlExceptionなどの一部の例外は、追加情報(ストアドプロシージャ名や行番号など)もキャプチャします。このような場合、例外全体をシリアル化し、それをXMLとしてログデータベースに保存すると便利です。すべての例外クラスをシリアル化できるわけではないことに注意してください。そのため、XML部分をパントする準備をしてください。

また、例外をログに記録するだけの場合は、より高いレベルで例外を処理できるように、例外を再スローすることをお勧めします。もちろん、これはすでに「トップレベル」にいる場合には適用されません。

于 2013-01-28T16:43:42.707 に答える
6

これを試してみてください:

try 
{
    //...
}
catch(Exception ex)
{
    Messagebox.Show(ex.ToString());
}

例外の種類メッセージ、すべての例外(順序付けられたすべての例外の)のスタックトレースなど、多くの情報が表示されます。InnerException

詳細については、MSDNを参照してください。

于 2013-01-28T16:33:24.613 に答える
0
        private static string ErrorManager(Exception ex, bool ShowPopUp, bool CrashProgram)
    {
        string stack = ex.StackTrace;
        string source = ex.Source;
        string message = ex.Message;
        string LF = Environment.NewLine;

        string Error = $"A crash happen at {DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss.ff", CultureInfo.InvariantCulture)}{LF}" +
                       $"This is what crashed: {source}{LF}" +
                       $"This is the error message : {LF}{message}{LF + LF}" +
                       $"These are the last instructions executed before the crash : {LF}{stack}{LF + LF}";

        if (ex.InnerException != null)
        {
            Error += $"Inner Exception : {LF}{ex.InnerException.Message}";
        }

        if (ShowPopUp)
        {
            MessageBox.Show(Error, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }

        if (CrashProgram)
        {
            throw new Exception(Error);
        }
        return Error.Trim();
    }
于 2019-01-08T16:11:40.777 に答える