質問

asp.netサイトの優れたエラー処理方法は何ですか?例?ありがとう!

役に立ちましたか?

解決

.netプロジェクトと同様に、特定のエラータイプが特定のページで発生する可能性がある場合にのみ特定のエラータイプをキャッチするのが最善の方法であると思います。

たとえば、入力が与えられたユーザーのフォーマット例外をキャッチできます(JavaScript検証が失敗し、tryparseを使用していない場合のみ)が、常にトップレベルの例外のキャッチはグローバルエラーハンドラーに任せます。

     try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

ASPのオープンソース elmah (エラーロギングモジュールおよびハンドラー)を使用できます。必要に応じて、.Netでこのトップレベル/グローバルエラーをキャッチします。

elmah を使用すると、エラーログを作成できます。 Webインターフェイスを構成します。また、さまざまな種類のエラーをフィルタリングし、さまざまな種類のエラー用に独自のカスタムエラーページを作成することもできます。

他のヒント

特に有用だと思う方法の1つは、汎用エラーページを作成し、web.configのcustomErrorsノードでdefaultRedirectをそのエラーページに設定することです。

すべての未処理の例外をログに記録するためにglobal.asaxをセットアップし、それらのクラス(未処理の例外)をいくつかのクラスの静的プロパティに配置します(静的なLastErrorプロパティを持つErrorUtilというクラスがあります)。エラーページはこのプロパティを見て、ユーザーに表示するものを決定できます。

詳細はこちら: http://www.codeproject.com/KB/aspnet /JcGlobalErrorHandling.aspx

まあ、それはかなり広く開いており、完全にクールです。 Dot Net Spider からダウンロードできる.docという単語を紹介します。これは実際に私の小さな会社のコード標準の基礎です。この標準には、非常に便利なエラー処理のヒントが含まれています。

このような例外の例(これがドキュメントのオリジナルなのか、ドキュメントに追加したのかは思い出せません): “キャッチ例外を実行せず、何も実行しません。”例外を非表示にすると、例外が発生したかどうかがわかりません。すべてのエラー状態をプログラムで確認することにより、常に例外を回避するようにしてください。

してはいけないことの例:

try
{
   ...
}
catch{}

正当な理由がない限り、非常にいたずら。

アプリケーションによって生成されるエラーのほとんどをキャッチし、ユーザーにわかりやすいメッセージを表示できることを確認する必要があります。しかしもちろん、web.configとdefaultRedirectを別のユーザーが使用できるため、すべてのエラーをキャッチすることはできません。エラーを記録する別の非常に便利なツールはELMAHです。 ELMAHは、アプリケーションによって生成されたすべてのエラーをログに記録し、非常に読みやすい方法で表示します。 ELMAHをアプリケーションに接続するのは、web.configファイルに数行のコードを追加してアセンブリを添付するだけです。間違いなくELMAHを試してみると、文字通り何時間も何時間も痛みが軽減されます。

http://code.google.com/p/elmah/

  1. 例外が発生するたびにユーザーを混乱させないように、発生する可能性のある例外を各ページ内で防御的にコーディングし、適切に処理します。

  2. すべての例外を参照付きで記録します。

  3. 未処理の例外については、一般的なエラーページを提供します。これは、サポートに使用するための参照を提供します(サポートはログから詳細を識別できます)。実際の例外は表示しないでください。ほとんどのユーザーはそれを理解しませんが、システムに関する情報(潜在的にパスワードなど)を公開するため、潜在的なセキュリティリスクになります。

  4. すべての例外をキャッチせず、それらに対して何もしません(上記の回答のように)。これを行う正当な理由はほとんどありません。特定の例外をキャッチし、意図的に何もしないこともありますが、これは賢明に使用する必要があります。

ユーザーを標準エラーページにリダイレクトすることは常に良い考えとは限りません。ユーザーがフォームで作業している場合、作業中のフォームからリダイレクトされたくない場合があります。 try / catchブロック内に例外を引き起こす可能性のあるすべてのコードを配置し、catchブロック内にエラーが発生したことをユーザーに警告するアラートメッセージを吐き出し、フォーム入力、クエリ文字列を含むデータベースに例外を記録します、など。しかし、私は内部サイトを開発しているので、ほとんどのユーザーは問題があれば私に電話するだけです。公開サイトの場合、elmahのようなものを使用できます。

public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
    {
        string authenticationID = string.Empty;
        int customerID = 0;
        string message = string.Empty;
        DA_Customer oDACustomer = new DA_Customer();

        using (TransactionScope scope = new TransactionScope())
        {
            if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
            {
                // if a new student
                if (oCustomerInfo.CustId == 0)
                {
                    oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
                    oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
                    authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
                    oCustLessonBookInfo.CustId = customerID;
                }
                else // if existing student
                {
                    oCustomerInfo.UpdatedByCustomer = "Y";
                    authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
                }
                message = authenticationID;
                // insert lesson booking details
                new DA_Lesson().BookLesson(oCustLessonBookInfo);
            }

            else
            {
                message = "login exists";
            }
            scope.Complete();
            return message;
        }

    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top