2013-07-19 13 views
5

私は一度だけ実行する必要がありますが、それは外部リソースに依存し、失敗する可能性がありますいくつかのコードを実行していますよ。イベントログにエラーが表示されるようにしたいが、ユーザーには表示させたくない。可能であれば、カスタムエラーページの使用を避けたいと思います。クリーンな方法

私は例外をキャッチし、イベントログに自分自身をそれを書くが、私は、私はasp.netのイベントソースの名前がどうなるか保証できないことを心配でした(それはフレームワークのバージョンに応じて変化するように見えます私は自分のイベントソースを作成することもできません。なぜなら、それには管理者権限が必要だからです。

私は現在の方に働いていることは(まだ動作しません)ハックのビットであり、それはこのようになりますアプローチは:

public void Init(HttpApplication context) 
    { 
     try 
     { 
      throw new Exception("test"); // This is where the code that errors would go 
     } 
     catch (Exception ex) 
     { 
      HttpContext.Current.Application.Add("CompilationFailed", ex); 
     } 
    } 

    private void context_BeginRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Application.AllKeys.Contains("CompilationFailed")) 
     { 
      // It failed on Init - we can't throw an exception there so lets try it here 

      var origEx = (Exception)HttpContext.Current.Application["CompilationFailed"]; 
      // Only ever do this once 
      HttpContext.Current.Application.Remove("CompilationFailed"); 

      // This should just look like a normal page load to the user 
      // - it will be the first request to the site so we won't be 
      // interrupting any postbacks or anything 


      HttpContext.Current.Response.AddHeader("Location", "/"); 
      HttpContext.Current.Response.StatusCode = 301; 
      try 
      { 
       HttpContext.Current.Response.End(); 
      } 
      catch (ThreadAbortException ex) 
      { 
       throw origEx; 
      } 
     } 
    } 

理想的には、私が本当に希望する(RecordExceptionです)メソッドが存在する場合は、そのIIS内に存在します。あなたはエラーが発生した場合に通知されるようにしたいが、ユーザーはそれについて知られたくないよう

+0

EnterpriseLoggingLibraryはこのようなもののための素晴らしいです - データベースへの例外をログに記録することができ、Windowsイベントログ、テキストファイル、またはあなたが考えることができる何か。 –

答えて

5

私は、ASP.NET用のElmahをお勧めします。

+1

ELMAHのデモhttp://www.youtube.com/watch?v=xAcH41ZSksU – prospector

+0

は良い解決策のように見えます。ありがとう。 – JoeS

1

が鳴ります。ページのリダイレクト(致命的なエラーの場合)を実行したり、電子メールを送信したり、アクセス権のあるデータソースに書き込みを行った後にファイル/ページの残りの実行を終了することができます。

関連する問題