none
aspxファイルのエラーハンドリングについて RRS feed

  • 質問

  • ASP.NETのC#2010で、WEBアプリを作成しています

    エラー処理について質問なのですが
    エラートラップはどのように処理すればいいのでしょう

    例えばデータアクセスオブジェクトがページ内にあったとして、
    データベースサーバがダウンしていた場合、
    --------------------------------------------------------------------------------------------------------
    '/' アプリケーションでサーバー エラーが発生しました。
    インスタンス エラーです。
    説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

    例外の詳細: System.InvalidOperationException: インスタンス エラーです。
    --------------------------------------------------------------------------------------------------------
    というような表示がされてしまいますが、
    これを、Page_Load等であらかじめtry - catch等で検出し、それなりのエラーメッセージを表示するなどしたいのですが・・・

    2013年10月15日 2:23

回答

  • > スタック トレースを参照してください
    • 回答としてマーク いちろう 2013年10月16日 15:06
    2013年10月15日 2:56
  • > Page_Load等であらかじめtry - catch等で検出し、それなりのエラーメッ
    > セージを表示するなどしたいのですが・・・

    以下のページによると「よほどのことがない限り、アプリケーションで try-catch を書いてはいけません。」 とのことです。自分もその通りだと思います。

    .NETの例外処理 Part.1
    http://blogs.msdn.com/b/nakama/archive/2008/12/29/net-part-1.aspx


    要求の処理中に Try/Catch ブロックで処置されなかった例外は、当該ページの Page_Error ハンドラおよび Global.asax の Application_Error ハンドラで処置し、例外を解釈してカスタムエラーページに適切なメッセージを表示することができます。

    以下の MSDN ライブラリに具体的な説明およびサンプルがあります。

    方法 : アプリケーションレベルのエラーを処理する
    http://msdn.microsoft.com/ja-jp/library/24395wz3%28v=VS.100%29.aspx

    エラー ハンドラーの完全なコード例
    http://msdn.microsoft.com/ja-jp/library/bb397417.aspx

     

    なお、上のサンプルコードを IIS7 で試した場合、Button 6(Global-NoCatch.asax へリダイレクト=アクセスが許可されてないファイルへリダイレクト) が期待通りにならないはずですので注意してください。詳しくは下記のページを参照。

    customErrors と requestFiltering
    http://surferonwww.info/BlogEngine/post/2010/10/12/customErrors-and-requestFiltering.aspx

    • 回答としてマーク いちろう 2013年10月16日 15:06
    2013年10月15日 3:13
  • これを、Page_Load等であらかじめtry - catch等で検出し、それなりのエラーメッセージを表示するなどしたいのですが・・・

    データベースがダウンしているかどうかをあらかじめ検査する必要は、ほとんどの場合ありません。なぜなら、実際にデータベースにアクセスした際に判断すれば済むだけのことだからです。さて、「それなりのエラーメッセージ」についてですが、実際にデータベースサーバーにpingを投げるなどして調査すればわからなくもないですが、ユーザーに「データベースがダウンしています」等のメッセージを表示する必要はないように思います。よくあるのが、「問題が発生しました。システム管理者に連絡して下さい。」というような汎用的なメッセージを出すことですが、それで十分なような気がします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク いちろう 2013年10月16日 15:06
    2013年10月15日 4:22
    モデレータ

すべての返信

  • > スタック トレースを参照してください
    • 回答としてマーク いちろう 2013年10月16日 15:06
    2013年10月15日 2:56
  • > Page_Load等であらかじめtry - catch等で検出し、それなりのエラーメッ
    > セージを表示するなどしたいのですが・・・

    以下のページによると「よほどのことがない限り、アプリケーションで try-catch を書いてはいけません。」 とのことです。自分もその通りだと思います。

    .NETの例外処理 Part.1
    http://blogs.msdn.com/b/nakama/archive/2008/12/29/net-part-1.aspx


    要求の処理中に Try/Catch ブロックで処置されなかった例外は、当該ページの Page_Error ハンドラおよび Global.asax の Application_Error ハンドラで処置し、例外を解釈してカスタムエラーページに適切なメッセージを表示することができます。

    以下の MSDN ライブラリに具体的な説明およびサンプルがあります。

    方法 : アプリケーションレベルのエラーを処理する
    http://msdn.microsoft.com/ja-jp/library/24395wz3%28v=VS.100%29.aspx

    エラー ハンドラーの完全なコード例
    http://msdn.microsoft.com/ja-jp/library/bb397417.aspx

     

    なお、上のサンプルコードを IIS7 で試した場合、Button 6(Global-NoCatch.asax へリダイレクト=アクセスが許可されてないファイルへリダイレクト) が期待通りにならないはずですので注意してください。詳しくは下記のページを参照。

    customErrors と requestFiltering
    http://surferonwww.info/BlogEngine/post/2010/10/12/customErrors-and-requestFiltering.aspx

    • 回答としてマーク いちろう 2013年10月16日 15:06
    2013年10月15日 3:13
  • これを、Page_Load等であらかじめtry - catch等で検出し、それなりのエラーメッセージを表示するなどしたいのですが・・・

    データベースがダウンしているかどうかをあらかじめ検査する必要は、ほとんどの場合ありません。なぜなら、実際にデータベースにアクセスした際に判断すれば済むだけのことだからです。さて、「それなりのエラーメッセージ」についてですが、実際にデータベースサーバーにpingを投げるなどして調査すればわからなくもないですが、ユーザーに「データベースがダウンしています」等のメッセージを表示する必要はないように思います。よくあるのが、「問題が発生しました。システム管理者に連絡して下さい。」というような汎用的なメッセージを出すことですが、それで十分なような気がします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク いちろう 2013年10月16日 15:06
    2013年10月15日 4:22
    モデレータ
  • 皆さん、ありがとうございます

    方法がいくつかあるみたいですね。これらを試してみます

    また、今回はDBのエラー、ファイルのエラーなどをわかるように表示してくれというリクエストなので、そのようにしています

    2013年10月16日 15:07
  • > 方法がいくつかあるみたいですね。これらを試してみます

    回答を理解しているでしょうか? なんか、全く見てなくて適当に返事をされたように思えますが。

    ASP.NET Web Forms アプリに限れば、方法は一つしかないと言ってもいいと思いますよ。レスに書いた URL のページを見て、よく考えていただけないと、回答する甲斐がないです。

    2013年10月16日 15:27