2011-01-16 3 views
0

例外が発生したときにすべての例外状況を知りたい。私はC#の例外メール/ SMS /イベントログを送信するための内部キャッチブロックの挿入方法

  1. メールを送る
  2. 送信SMS
  3. 書き込み、それは
  4. 書き込みイベントログ など

    試し{ /ファイルログインするために、すべてのcatchブロック内のコードを記述する必要があると思います/何かをする } catch(例外ex){ //私を送る... }

コードを書き込まずにキャッチブロックを挿入する簡単な方法はありますか?

PS:回答のリンクを読んでいるうちにいくつかの記事が出てきて、私の質問にクォータを追加したいと思います。

Exception Handling Best Practices in .NET

キャッチ一般的な例外が を公表しなければならない本当にあなたがログに使用するかは重要ではありません - 本当に重要なのは何等のlog4netの、EIF、イベントログ、TraceListeners、テキストファイルは、次の場合ジェネリックExceptionを捕まえて、どこかにログオンしてください。しかし、一度だけログしてください。例外をログに記録するcatchブロックがコードに載っていて、巨大なログになってしまいます。

+1

Spring.NETのようなサードパーティのフレームワークを使用できますか? – djeeg

+0

春!私はそれがJava上にあることを知っていた。それはいいだろう。あなたがSpring.Netを学ぶための良い情報源を知っていれば共有してください。 – uzay95

答えて

2

例外メッセージやスタックトレースを記録する独自の例外クラスを作成することができます。これはlog4netを使って行いますが、動作しますが、一貫した実装が必要です。ほとんどの場合、例外を処理する方法がわからない場合は、単にコールスタックをバブルアップする必要があるため、レイヤーまたは層の境界でこれを行うだけです。以下のような

何か:一つ一つの例外を取得するというアイデアは面白い思えますが

[Serializable] 
public class FooException : Exception 
{ 
    // Logger configured for email, file, etc. 
    static ILog _log = LogFactory.Create(); 

    public FooException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     _log.Error(message, innerException); 
    } 

    // ... 
} 

public class FooDataAccess<T> : IFooRepository 
{ 
    public T GetFoo() 
    { 
     // Consider creating general helper methods with 
     // Action, Func, parameters so that you only have 
     // to code the try ... catch block once. 
     try 
     {    
      // all exceptions caught 
     } 
     catch (Exception e) 
     { 
      throw new FooException(Exceptions.GetFooException, e); 
     } 
    }  
} 
+0

これは本当に良いです。あなたはEnterprise Libraryを使用しましたか?どのようにLogFactoryにログの宛先を選択して渡すことができますか? – uzay95

+0

ELは必要ありませんが、あなたはそのアプローチを使用できます。我々はlog4netを使用します。これは、ログを作成するプロセスから出力されるログの出力先を抽象化します。これにより、変更が容易になります。 – si618

1

PostSharpでアスペクト指向プログラミングを使用できます。

しかし、あなたがやっていることがすべて情報とロギングを収集しているのであれば、あなたの一番上に単一のエラーハンドラを持つ方が良い選択です。あなたはそうスタックトレースを取得します。

+0

まず、価格があるソフトウェアなしでコードでそれをすることを学びたいと思います。 – uzay95

+0

@ uzay95 - おそらく、あなたの質問でそう言っていたはずです。 – Oded

+0

はい。しかし、このツールを知っていることは良いことです。ありがとう。 – uzay95

1

Spring.net,UnityまたはMEFは、すべてオープンソースであり、ウェブ上でのドキュメントやサンプルがあります。しかし、もしあなたがこの問題を抱えていれば、私は個人的にそれをやりたい、あるいはこれを扱うためにクロージャーを使うことを好みます。

Enterprise Libraryを使用し、Quick startも参照してください。これには設定と例外ハンドラが必要です。単純な設定を学習し、ハンドラを持っている場合は10分以内で(またはほとんどの1時間)。

0

は、それはやり過ぎかもしれません。

私の経験では、実行時設定可能なロギングフレームワーク(log4netなど)を使用すると、このシナリオがきれいに処理されることがわかりました。

多くのメリットがあります。 私が見つけた最大の利点は、クラスごとのログを使用する場合、クラスレベルで例外メールを受信するときに調整できることです。

これは、既知で重要ではないと考えられる例外の場合、その例外の電子メールレポートをオフにして、ディスク上のテキストファイルにログを残すように構成を変更することができます。

これらのオプションはすべてログ設定で設定されているため、監視を担当する運用チームはアプリケーションコードを変更することなく設定を変更できます。

一部のログフレームワークでは、アプリケーションの実行中にこの再構成を行うこともできます。

唯一の欠点は、キャッチブロックがある場合でも、ログ情報を散水することに勤勉にする必要があることです。

関連する問題