2012-04-13 7 views
0

私のサイトで例外が発生するたびに例外を詳述する電子メールが送られるように属性を作成しています。私はこれまで持っているが、例外が発生した場合、私の属性コードが発射していないようです: 例外を確認するための属性の作成

public class ReportingAttribute : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     // This will generate an email to me 
     ErrorReporting.GenerateEmail(filterContext.Exception); 
    } 
} 

はその後、私のコントローラ上で、私がやっている:

[ReportingAttribute] 
public class AccountController : Controller 

それを行うための他の方法を私のキャッチブロックにErrorReporting.GenerateEmail(ex)を入れているのはどうですか?より簡単な方法が必要ですか?ただ、それ自体でできない

private void Application_Error(object sender, EventArgs e) 
{ 
    try 
    { 
     // 
     // Try to be as "defensive" as possible, to ensure gathering of max. amount of info. 
     // 

     HttpApplication app = (HttpApplication) sender; 

     if(null != app.Context) 
     { 
      HttpContext context = app.Context; 

      if(null != context.AllErrors) 
      { 
       foreach(Exception ex in context.AllErrors) 
       { 
        // Log the **ex** or send it via mail. 
       } 
      } 

      context.ClearError(); 
      context.Server.Transfer("~/YourErrorPage"); 
     } 
    } 
    catch 
    { 
     HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.InternalServerError; 
     HttpContext.Current.ApplicationInstance.CompleteRequest(); 
    } 
} 
+0

からあなたのコントローラを引き出すには、 'IExceptionFilter.OnException()'だけで未処理の例外で呼び出されていないですか? –

答えて

2

を処理するために属性を作成すると考えThatsなぜ、あなたはあなたのGlobal.asax.csファイルに次のメソッドを定義することができますビヘイビアを定義しますが、それはあなたのコードデータにいくつかの印を付けます。あなたは

  • は、それが存在する場合、必要なデータを収集し、送信例外
  • を上げた方法の特定の属性の存在のための例外
  • チェックを取得し、コードを書く必要があります。ベースコントローラ作成しないのはなぜ
+0

よく捕らえているかどうかにかかわらず、すべての例外を郵送したい – CallumVass

+0

例外をキャッチして再投棄しないと、アプリケーションが正常に処理されることはありませんか?それができれば、なぜ例外を郵送する必要がありますか?あなたが必要とするまれなケースでは、 'catch'ブロックに手作業でコード行を書くことができます。捕まえられなかった(または再投げられた)例外は自動的にあなたに郵送されます。 –

+0

まあ、私はあなたに例を挙げます:私のアプリは私のWebサービスに大きく依存しています。何らかの理由でこれがダウンすると、ユーザーをログアウトしてエラーが発生したことを伝える必要があります。これはうまく動作しますが、余分な機能として、問題があるため早期に修正しようとすることができるというメールを受け取ってみたいと思います。今では、この例外を手動ではなく捕捉するためのこのコードを各キャッチブロックに書き込むと、属性や何かを作成するだけでいいと思った。 – CallumVass

1

Attribute:私はすべてキャッチされない例外をログ出力のために、この

0

public ApplicationBaseController : Controller 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     //Send your e-mail 
    } 
} 

をそしてApplicationBaseController

public HomeController : ApplicationBaseController 
{ 
    //..... 
} 
+0

私はこれを試しましたが、例外が発生したときに電子メールを受け取ることができませんでした。 – CallumVass

+0

電子メールの設定が正しく設定されていますか?このメソッドは**未処理の例外**でのみ呼び出されることに注意してください –

関連する問題