27

スローされてキャッチされた例外をログに記録する方法は? Visual Studio の IntelliTrace のようなものです。または、InteliTrace をアプリケーションのデバッグ バージョンに統合し、そのログを表示する方法はありますか?

更新:少し明確にします。標準の .txt (または任意のカスタム) ログが必要です。形式は関係ありません。要点は、コードを追加せずに、すべてのサードパーティ ライブラリで発生したすべての例外をログに記録したいということです。

4

8 に答える 8

31

あなたが探している機能が呼び出され、 AppDomain.FirstChanceException イベントFirstChanceException経由でアクセスできると 思います

基本的に、このイベントは、 でスローされる(マネージド) 例外に関する情報を取得するためのフックを提供しますAppDomain。この方法では例外を処理できません! お知らせの一種でしかない


更新:別の回答での「飲み込まれた例外」に関するコメントについて-そして暗闇へのショット:
x64 システムでは、Windows の onLoad メソッドでスローされる例外は Main() メソッドでキャッチできません。
参照用にこのSOの記事を参照してください


更新 2:Threads自分で実装する必要があると思います。これにはある種のポーリングが含まれ、パフォーマンスが低下しますが、ほとんどの場合、デバッグには問題ないと思います。これは、

var threads = Process.GetCurrentProcess().Threads;
于 2011-08-16T09:40:15.953 に答える
5

あなたは側面に行くかもしれません。たとえば、PostSharpを使用して、関数ごとに try-catch を作成するアスペクトを作成すると、そのアスペクトでログが記録されます。ログを記録した後、それを再スローします。

デモコードで完全な回答を得るためのウェブサイトのコード例:

/// <summary>
/// Aspect that, when applied on a method, catches all its exceptions,
/// assign them a GUID, log them, and replace them by an <see cref="InternalException"/>.
/// </summary>
[Serializable]
public class ExceptionPolicyAttribute : OnExceptionAspect
{
    /// <summary>
    /// Method invoked upon failure of the method to which the current
    /// aspect is applied.
    /// </summary>
    /// <param name="args">Information about the method being executed.</param>
    public override void OnException(MethodExecutionArgs args)
    {
        Guid guid = Guid.NewGuid();

        Trace.TraceError("Exception {0} handled by ExceptionPolicyAttribute: {1}",
            guid, args.Exception.ToString());

        throw new InternalException(
            string.Format("An internal exception has occurred. Use the id {0} " +
                "for further reference to this issue.", guid));
    }
}

編集:

log4net、NLog、またはエンタープライズ ライブラリなどの任意のロガーを使用できます (ロギングやその他のものを行うための私の好みの方法)。しかし、それはここでの本当の仕事ではありません。タスクは - 私見 - 可能な限り少ない手動コーディングでプロジェクトにログを挿入することです。

于 2011-08-16T09:37:51.103 に答える
1

処理された例外については、明示的にログに記録する必要がある可能性が最も高いでしょう。意味的にそうではない場合でも、処理される例外と処理されない例外には大きな違いがあります。

処理された例外は、もはや例外的な状況ではありません。コードを書いている誰かが言った。この例外を処理する方法を知っており、その後正しく続行します。

未処理の例外については、Elmahを参照してください。

于 2011-08-16T09:28:56.680 に答える
1

Log4Net を使用してみてください - これは優れたロガーであり、これらのシナリオで多く使用されていますhttp://sourceforge.net/projects/log4net/

于 2011-08-16T09:26:27.863 に答える
1

WinDbg などのデバッガーをプロセスにアタッチし、最初のチャンスの CLR 例外で中断させることができます。これには、サードパーティ ライブラリの例外が含まれます。これを行う方法の例については、こちらを参照してください。

于 2011-08-16T09:44:18.247 に答える
0

一部の人によって提案された Log4Net の代わりに、 NLog を使用することもできます。2 つのソリューションの違いはわかりませんが、NLog に満足していることだけはわかっています。

于 2011-08-16T09:36:35.487 に答える
0

独自のログ システムを使用するか、log4net というサード パーティのライブラリを使用できます。

于 2011-08-16T09:25:27.227 に答える