質問
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を試してみると、文字通り何時間も何時間も痛みが軽減されます。
-
例外が発生するたびにユーザーを混乱させないように、発生する可能性のある例外を各ページ内で防御的にコーディングし、適切に処理します。
-
すべての例外を参照付きで記録します。
-
未処理の例外については、一般的なエラーページを提供します。これは、サポートに使用するための参照を提供します(サポートはログから詳細を識別できます)。実際の例外は表示しないでください。ほとんどのユーザーはそれを理解しませんが、システムに関する情報(潜在的にパスワードなど)を公開するため、潜在的なセキュリティリスクになります。
-
すべての例外をキャッチせず、それらに対して何もしません(上記の回答のように)。これを行う正当な理由はほとんどありません。特定の例外をキャッチし、意図的に何もしないこともありますが、これは賢明に使用する必要があります。
ユーザーを標準エラーページにリダイレクトすることは常に良い考えとは限りません。ユーザーがフォームで作業している場合、作業中のフォームからリダイレクトされたくない場合があります。 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;
}
}