asp.net サイトの適切なエラー処理方法は何ですか? 例?ありがとう!
7 に答える
他の.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.Netのオープンソースelmah(エラーログモジュールとハンドラー)を使用して、このトップレベル/グローバルエラーキャッチを実行できます。
elmahを使用すると、簡単に構成できるWebインターフェイスで表示できるエラーのログを作成できます。また、さまざまなタイプのエラーをフィルタリングし、さまざまなエラータイプ用に独自のカスタムエラーページを作成することもできます。
特に役立つと思われる 1 つの方法は、一般的なエラー ページを作成し、web.config の customErrors ノードで defaultRedirect をそのエラー ページに設定することです。
次に、すべての未処理の例外をログに記録するように global.asax をセットアップし、それら (未処理の例外) をいくつかのクラスの静的プロパティに配置します (静的な LastError プロパティを持つ ErrorUtil というクラスがあります)。エラー ページは、このプロパティを参照して、ユーザーに何を表示するかを決定できます。
詳細はこちら: http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx
まあ、それはかなり広く開いています、それは完全にクールです。Dot Net Spiderからダウンロードできる.docという単語を参照します。これは、実際には私の小さな会社のコード標準の基礎となっています。この規格には、非常に役立つエラー処理のヒントがいくつか含まれています。
例外のそのような例の1つ(これがドキュメントにオリジナルであるか、ドキュメントに追加したかは思い出せません):「例外をキャッチして何もしない」ことは絶対にしないでください。例外を非表示にすると、例外が発生したかどうかがわかりません。プログラムですべてのエラー状態をチェックすることにより、常に例外を回避するようにしてください。
してはいけないことの例:
try
{
...
}
catch{}
正当な理由がない限り、非常にいたずらです。
アプリケーションによって生成されるエラーのほとんどをキャッチし、ユーザーにわかりやすいメッセージを表示できることを確認する必要があります。ただし、もちろん、別のユーザーがweb.configとdefaultRedirectを使用できるため、すべてのエラーをキャッチすることはできません。エラーをログに記録するためのもう1つの非常に便利なツールはELMAHです。ELMAHは、アプリケーションによって生成されたすべてのエラーをログに記録し、非常に読みやすい方法で表示します。ELMAHをアプリケーションにプラグインするのは、web.configファイルに数行のコードを追加してアセンブリをアタッチするだけです。あなたは間違いなく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;
}
}
発生する可能性のある例外について各ページ内で防御的にコーディングし、それらを適切に処理して、例外が発生するたびにユーザーを混乱させないようにします。
参照を使用して、すべての例外をログに記録します。
未処理の例外については、サポートに使用するための参照を提供する一般的なエラーページを提供します(サポートはログから詳細を識別できます)。ほとんどのユーザーは例外を理解しませんが、システムに関する情報(パスワードなど)が公開されるため、セキュリティ上のリスクが生じる可能性があるため、実際の例外を表示しないでください。
すべての例外をキャッチせず、それらに対して何もしません(上記の回答のように)。これを行う正当な理由はほとんどありません。特定の例外をキャッチして意図的に実行しない場合がありますが、これは賢明に使用する必要があります。
ユーザーを標準のエラーページにリダイレクトすることは必ずしも良い考えではありません。ユーザーがフォームで作業している場合、作業中のフォームからリダイレクトされたくない場合があります。例外を引き起こす可能性のあるすべてのコードをtry/catchブロック内に配置し、catchブロック内に、エラーが発生したことをユーザーに警告するアラートメッセージを出力し、フォーム入力、クエリ文字列を含むデータベースに例外を記録します。 、など。私は内部サイトを開発していますが、ほとんどのユーザーは問題が発生した場合に電話をかけてきます。公開サイトの場合は、elmahのようなものを使用することをお勧めします。