2

すべてのメソッドに try catch を記述せずに、すべてのメソッドを try catch 内にラップできる方法が存在する場合。

現在、以下のアプローチを使用しています。

public TValue ErrorHandler<TValue>(Func<TValue> action)
    {
        try
        {
            return (TValue)action();
        }
        catch (Exception ex)
        {
            //Handle Exception and Log it..........
            return default(TValue);
        }
    }

    public void ErrorHandler(Action action)
    {
        try
        {
            action();
        }
        catch (Exception ex)
        {
            //Handle Exception and Log it..........
        }
    }

これは次のように使用されます。

public void ClearControls()
    {
        this.ErrorHandler(() =>
        {
               //................................
        });
    } 

これは Lambda を使用しているため、デバッグ中にコードを編集すると、強制的にアプリケーションを再実行します。

Try Catch をすべてのメソッドに実装し、問題なくコードをデバッグできる他の解決策を教えてください。

4

3 に答える 3

3
  • すべてを でラップしないでくださいtry-catchtry-catchIO 操作など、コードにバグがなくても通常は例外が発生する可能性がある場所で使用します。すべてをラップすると、実際にはテストとデバッグが難しくなり、コードの品質が低下する可能性があります。バグが発生し、開発の早い段階でそれらをキャッチします。
  • ロギングと、実行したい他のすべての一般的な処理を実行するハンドラ メソッドを記述し、そのメソッドをブロックtry-catchで使用するだけです。catch
  • AppDomain.Current.UnhandledExceptionイベントtry-catchをサブスクライブすることにより、ブロックによって処理されない例外をログに記録するために、グローバル例外ハンドラーを使用します。
于 2012-06-08T11:43:11.213 に答える
3

ここでは、 PostSharpなどのAOPフレームワークが役立ちます。hereに関するブログ投稿があります。OnExceptionAspect

基本的に、try-catch をメソッドに入れる代わりに、属性 (この場合はアスペクト) でメソッドを装飾します。

個人的には、これを実際に使用することはありません。処理できるものだけを試したりキャッチしたりして、アプリ全体でメソッドごとのログなどを必要としたことがないからです。扱えないなら捕まえるな。


更新:あなたのコメントに基づいて、PostSharp の代替は、無料のCastle DynamicProxyです。PostSharp ライセンスに関しては、無料バージョンから必要な動作を得ることができるはずです。これは、こちらで詳しく説明されているように、メソッド レベルの aspest をカバーしています。

于 2012-06-08T11:32:53.470 に答える
0

最も簡単な解決策は、呼び出し元でエラーをキャッチするか、さらに一歩進んで、通常は Program.cs または global.asax.cs であるスレッド エントリ ポイントです。

于 2012-06-08T11:35:01.927 に答える