2012-03-16 21 views
2

次の例外処理方法は正しいですか?私は、エラーを記録し、最終的に電子メールでログファイルを送信するのが難しいと思っています。 どこにエラーを記録して電子メールを送信するコードを記述しますか?例外ログ記録および電子メールの送信

大きな問題は、SomeClass1で例外が生成されたときに2回記録されることです.SomeClass2から2回目です。単一のカスタム例外タイプ(この例ではSomeException)を作成し、発生するたびにSystem.Exceptionをラップすることをお勧めしますか?

また、try-catchが連鎖しているときにエンドユーザーにエラーメッセージを表示する方法とタイミングについて混乱しています。

class SomeClass1 
{ 
    public static DataExtract(string sourcepath) 
    { 
     try 
     { 
      OleDbConnection oledb = new OleDbConnection(); 
      oledb.ConnectionString = "someconnectionstring"; 
      CompanyOLEDB.Open(); 
     } 
     catch (Exception e) 
     { 
      throw new CustomException(e); 
     } 
    } 
} 

class SomeClass2 
{ 
    private void SomeMethod() 
    { 
     try 
     { 
      // some code 
      // some code 

      SomeClass1.DataExtract() 
     } 
     catch (Exception e) 
     { 
      throw new CustomException(e); 
     } 
    } 
} 

public class CustomException : Exception 
{ 
    protected CustomException() { } 

    public CustomException(Exception e) 
    { 
     Log(e); 
    } 

    public CustomException(ExceptionType type) 
    { 
     this.Data.Add("Type", type); 
     this.Data.Add("Message", "No message specified"); 
    } 

    public CustomException(ExceptionType type, string message) 
    { 
     this.Data.Add("Type", type); 
     this.Data.Add("Message", message); 
    } 

    public static void Log(Exception e) 
    { 
     System.IO.File.WriteAllText(Logfile.txt", e.ToString()); 
    } 

    public static void Sendmail() 
    { 
     ExceptionMail.Sendmail(); 
    } 
} 
+0

号はhttp://msdn.microsoft.com/en-us/library/ms229014.aspx –

+0

が重複する可能性を参照してください。 [Windowsフォームアプリケーションの例外処理のベストプラクティス?](http://stackoverflow.com/questions/183589/best-practice-for-exception-handling-in-a-windows-forms-application) –

答えて

5

次の例外処理方法は正しいですか?

いいえいくつかの問題があります。ここには2つの最も重要なものがあります。

1.あなたは

かなり重要に処理できない例外をキャッチしてはいけません。例外を記録し直すだけの例外ブロックは、値を追加せずにコードを乱雑にします。アプリケーションがクラッシュするのを防ぐために、最上位レイヤ(Webサービス、MVCコントローラ、バックグラウンドスレッドなど)のすべての例外をキャッチするだけです。 (ただし、アプリケーションをクラッシュさせるためにが良い場合があります。

メソッドが期待値を返すことができる場合、例外が処理されました。

2.いつもあなたがあなただけのオリジナルの例外からの部分的な情報をコピーする際に、将来的に情報を予防できることが重要な情報を隠している

元の例外があります。

あなたはこのようにそれを行う必要があり、他のスロー/キャッチする必要がある場合:

public class CustomException : Exception 
{ 
    public CustomException(string msg, Exception inner) : base(msg, inner){} 
} 

//および方法で:あなたのコードに比べ

public void DoSomething() 
{ 
    try 
    { 
     SomeCoolOp(); 
    } 
    catch (Exception err) 
    { 
     throw new CustomException("Tried to allocate some cool stuff", err); 
    } 
} 

変更:

  1. Microsoftが推奨する方法で元の例外を追加します。
  2. operation specificメッセージを書く。例外は、私は例外処理について、いくつかのブログの記事を書いた

詳しい情報

(代わりに元のメッセージを使用しての)が起こったとき、私たちがしようとしたものを記述する。

あなたは読書で起動することができます。http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

、残りを読むより:http://blog.gauffin.org/tag/exceptions/

+0

MVPパターンのような階層構造を使用している最上位レイヤのプレゼンテーションがあります。このレイヤーで例外がよりよく捕捉されることをお勧めします。 – arjun

+1

はい。ライブラリ内で処理できる例外のみをキャッチします。プレゼンテーションレイヤー内で他のすべての例外をキャッチします。私たちが例外をスローすると、 'Application.ThreadException'を使って未処理の例外をすべて捕まえて(電子メールで) – jgauffin

+0

することができます。新しいCustomExceptionをスローすると(通常の実行を中止します)プログラムのこれは例外を処理できないことを意味しますか? – arjun

1

おそらく多くのlog4netのようにそれはそれはファイル、DBテーブル、または電子メールにエラーを記録するように構成することができるELMAHのようなものを使用することを検討してください。

関連する問題