3

現在取り組んでいるプロジェクトに問題があります。開発者は、tryブロックに複数のcatchブロックを追加しました。各キャッチはエラーをログに記録し、それを再スローします。このようなもの:

catch (OdbcException ex)
{
    ex.Data.Add("CodeSource", MethodBase.GetCurrentMethod().Name);
    ex.Data.Add("My Value", myValue);
    Common.Logger.LogError(ex, "DataAccess");
    throw;
}
catch (Exception ex)
{
    ex.Data.Add("CodeSource", MethodBase.GetCurrentMethod().Name);
    ex.Data.Add("My Value", myValue);
    Common.Logger.LogError(ex, "DataAccess");
    throw;
}

その上、呼び出し側のクラスにも同じことを行うcatchブロックがある場合があります。したがって、ログファイルは混乱しています。同じメッセージが最大5つ以上ログに記録されています。

とにかく、どこでもコードを変更することなく、エラーを1回だけログに記録できますか?悲しいことに、プロジェクトは終わりに近づいているので、彼らはそれを正しく行うために余分な時間を費やしたくないのです。><

4

4 に答える 4

0

ベスト プラクティスは、すべてのレベルで例外をキャッチしないことです。ロギングのみを行っている場合は、「上部」で例外をキャッチしてログに記録するだけです。

「一番上」ってどういう意味ですか?それは、使用しているテクノロジーによって異なります。それを考える方法は、「可能な限り最後の瞬間に」例外をキャッチすることです。コードのその時点でキャッチします。そこでキャッチしないと、まったくキャッチされません。

これは、イベント ハンドラー、非同期コールバック、または Web サービスのトップ レベルにある可能性があります。

于 2013-01-03T16:41:39.873 に答える
0

Global.asax の Application_Error イベントを使用して例外をログに記録できます (ただし、次の 警告に注意してください)。

protected void Application_Error(object sender, EventArgs e)
{
    LogExceptionDetails(Server.GetLastError());
    HttpContext.Current.Server.Transfer("~/Error.aspx");;
}

これをHttpModule として実装すると、web.config ファイルを変更するだけで、例外ログを他のアプリケーションにプラグインしたり、削除したりできます。コードの詳細については、そのリンクを参照してください。

あるいは、 ELMAHは例外ロギング用の非常に便利なライブラリです。ログを記録した後、カスタム エラー ページにリダイレクトできます(コードの詳細については、リンクを参照してください)。

<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/CustomError.aspx">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>
于 2013-01-03T17:04:02.203 に答える
0

発生したときにのみログに記録したい場合は、スローされたときに Common.Logger.LogError を変更して ex.Data.Add("ExceptionLogged", true) のようなものを追加する必要があるだけで、ループするだけですそれらのいずれかがこの値を取得したかどうかを確認するための内部例外。取得している場合は、保存をスキップします

于 2013-01-03T16:37:41.943 に答える
0

私が考えることができる唯一のことは、Common.Loggerクラスを制御する場合、そこにある種のロジックを追加して、例外の最初の発生のみをログに記録することです。いくつかのスレッド ストレージを使用して例外を追跡しようとするか、タグが asp.net に言及しているため、 HttpContext.Itemsを使用できます。例えば:

public static class Logger
{
    public static void LogError(Exception e, string category)
    {            
        int hashcode = e.GetHashCode();
        if (!HttpContext.Current.Items.Contains(hashcode))
        {
            HttpContext.Current.Items.Add(hashcode, null); 
            System.Diagnostics.Trace.TraceError(e.ToString());
        }
    }
}

おそらくそれが役立つでしょうか?

于 2013-01-04T07:29:27.123 に答える