3

GUIを使用して適切に表示できるように、スローされた例外に関する情報を含むテストロガーを作成しています。

次の構成を使用しても安全ですか。

public class TestLogEntry {
    public System.Exception Exception { get; private set; }

    public TestLogEntry(/*...,*/ System.Exception exception = null) {
        //...

        Exception = exception;
    }
}

それとも以下の方が良いでしょうか?

public class TestLogEntry {
    public string StackTrace { get; private set; }
    public System.Type ExceptionType { get; private set; }
    public string ExceptionMessage { get; private set; }

    public TestLogEntry(/*...,*/ System.Exception exception = null) {
        //...

        if (exception != null) {
            StackTrace = exception.StackTrace;
            ExceptionType = exception.GetType();
            ExceptionMessage = exception.Message;
        }
    }
}

最初のアプローチはより柔軟ですが (追加のカスタム データを含めることができるため)、ここに私の懸念があります。

  • 例外オブジェクトを長期間保持します。
  • 例外オブジェクトが大きなオブジェクトのガベージ コレクションを妨げている場合、大量のメモリを使用します。
  • コンテキスト外でアクセスすると、間違った値を返す例外。

Q1. 上記の懸念は有効ですか?

Q2. 通常、例外オブジェクトは他の多くのデータを参照しますか?

4

3 に答える 3

4

あなたの懸念は有効です。例外オブジェクトは、任意の他のオブジェクトを保持する可能性があります。これは実際には非常にまれです。実際、私はException.Dataプロパティが使用されているのを見たことがありません。Exceptionしかし、派生クラスがカスタム フィールドを使用して何か大きなものを保持しているのを見てWebExceptionきました: プロパティを持っていWebResponseます!

したがって、管理されていないリソースと同じくらい高価なものであっても、生き続けている可能性があることがわかります。

実際に情報をコピーして破棄しExceptionます。も忘れずにコピーしてくださいInnerException

別の懸念Exceptionは、可変型であることです。スタック トレースを変更することで、いつでもスローできます。それだけの理由でその状態をキャプチャしたいと思います。

また、メモリ使用量も重要です。例外には、おそらく使用されないフィールドがいくつかあります。それらを保存できます。また、そのフィールドをログ メッセージ オブジェクトにインライン化すると、オブジェクト ヘッダーとオブジェクト参照が削除されます。小さな利益ですが、頻繁に例外が発生する場合には、取る価値があるかもしれません。

于 2013-02-07T19:56:46.890 に答える
3

例外を保持することは問題ありません。

一般に、それらは多くのデータ (スタック トレース、エラー メッセージ、および関連データ) を保持しませんが、これは多くはありません。

また、例外の 1 つのインスタンスは、同じ型であっても他のインスタンスに影響を与えません。

そう:

例外オブジェクトを長期間保持します。

問題ありません。

例外オブジェクトが大きなオブジェクトのガベージ コレクションを妨げている場合、大量のメモリを使用します。

例外に大量のデータを追加する場合にのみ問題になります。追加しない場合、これは問題ではありません。

コンテキスト外でアクセスすると、間違った値を返す例外。

それが何を意味するのかわからない-どのようなコンテキストですか?例外は例外です。

于 2013-02-07T19:56:18.573 に答える
0

「長く」または「たくさん」と書くとき、これらは絶対的な用語ではなく相対的なものであるため、これらの懸念が多すぎるかどうかは誰にも言えないことを理解する必要があると思います. 私の 10 コア マシンには 2Gb の RAM があり、Windows サーバーに展開しているので、メモリへの影響は少しも気になりません。おそらく、予備の RAM が数バイトしかない古い Windows Phone で実行していると思います。知るか?疑わしい場合は、メモリ使用量をプロファイルしてください。ただし、メモリが問題である場合は驚くでしょう。

一般に、私にとってより大きな懸念は、ユーザーにステータス メッセージを表示する方法として例外を使用したくなるかもしれないということです。これはクールではありません。例外は例外的な条件です。それらから有意義に回復することさえできないかもしれません。例外の記録を保持したい場合は、例外をデータベースに記録することができます (例: log4net を使用)。

于 2013-02-07T20:02:28.597 に答える