jQuery.ajax() を使用する場合、エラーはどのように処理しますか?
質問
使用するとき jQueryさんの ajaxメソッド フォームデータを送信する場合、エラーを処理する最善の方法は何ですか?これは、呼び出しがどのようなものになるかの例です。
$.ajax({
url: "userCreation.ashx",
data: { u:userName, p:password, e:email },
type: "POST",
beforeSend: function(){disableSubmitButton();},
complete: function(){enableSubmitButton();},
error: function(xhr, statusText, errorThrown){
// Work out what the error was and display the appropriate message
},
success: function(data){
displayUserCreatedMessage();
refreshUserList();
}
});
ユーザー名が重複している、電子メール アドレスが重複しているなど、さまざまな理由でリクエストが失敗する可能性があります。この場合、ashx は例外をスローするように作成されています。
私の問題は、例外をスローすることによって、ashx が statusText
そして errorThrown
することが 未定義.
に着くことができます XMLHttpRequest.responseText
これには、標準の .net エラー ページを構成する HTML が含まれています。
私は、responseText でページのタイトルを見つけ、そのタイトルを使用してどのエラーがスローされたかを調べています。ただし、カスタム エラー処理ページを有効にすると、これが崩れるのではないかという疑念があります。
ashx でエラーをスローする必要があるのか、それとも呼び出しによって返されるデータの一部としてステータス コードを返す必要があるのでしょうか。 userCreation.ashx
, 、次に、これを使用して、どのようなアクションを実行するかを決定しますか?
こうした状況にどう対処しますか?
解決
ASHXのエラーをスローする必要がありますか、それともuserCreation.ASHXへの呼び出しによって返されるデータの一部としてステータスコードを返す必要があります。これらの状況をどのように処理しますか?
個人的には、可能であればこれをサーバー側で処理し、そこでユーザーへのメッセージを作成したいと考えています。これは、何が起こったかを伝えるメッセージ (本質的には検証メッセージ) をユーザーに表示するだけのシナリオで非常にうまく機能します。
ただし、サーバー上で発生したことに基づいてアクションを実行したい場合は、ステータス コードを使用し、そのステータス コードに基づいてさまざまなアクションを実行するための JavaScript を作成することもできます。
他のヒント
デバッグの場合、通常は要素を作成するだけです (以下の場合: <div id="error"></div>
) ページ上で XmlHttpRequest を書き込みます。
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText);
}
次に、発生しているエラーの種類を確認し、それらを正しくキャプチャできます。
if (XMLHttpRequest.status === 404) // display some page not found error
if (XMLHttpRequest.status === 500) // display some server error
ashx で、新しい例外 (「無効なユーザー」など) をスローして、それを解析するだけで済みますか? XMLHttpRequest.responseText
?私にとって、エラーが発生したときは、 XMLHttpRequest.responseText
これは標準の Asp.Net エラー ページではなく、次のようなエラーを含む JSON オブジェクトです。
{
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n
Parameter name: index",
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n
at etc...",
"ExceptionType":"System.ArgumentOutOfRangeException"
}
編集:これは、呼び出している関数が次の属性でマークされていることが原因である可能性があります。
<WebMethod()> _
<ScriptMethod()> _
さて、どの答えを受け入れるべきかという問題があります。
この問題についてさらに深く考えてみると、私が誤って例外をスローしていたという結論に至りました。ユーザー名や電子メール アドレスなどの重複は、サインアップ プロセス中に予想される問題であるため、例外ではなく、単なるエラーです。その場合、おそらく例外をスローするのではなく、エラーコードを返す必要があります。
それが私にそう思うようにさせる イロビンソンの この場合、特にフォームは表示されている UI のほんの一部にすぎないため、このアプローチを採用する必要があります。私はこのソリューションを実装し、ステータスと表示されるオプションのメッセージを含む XML を返しています。その後、jQuery を使用してそれを解析し、適切なアクションを実行できます。-
success: function(data){
var created = $("result", data).attr("success");
if (created == "OK"){
resetNewUserForm();
listUsers('');
} else {
var errorMessage = $("result", data).attr("message");
$("#newUserErrorMessage").text(errorMessage).show();
}
enableNewUserForm();
}
しかし トラヴィス' 答えは非常に詳細であり、デバッグ中、またはユーザーに例外メッセージを表示したい場合に最適です。私は間違いなく JSON を受け取っていません。私のコードにはそれらの属性がないので、おそらく travis がリストしたこれらの属性のいずれかが原因であると考えられます。
(私はirobinsonの答えを受け入れるつもりですが、travisの答えに賛成票を投じます。最も多くの票を獲得していない回答を受け入れるのは奇妙に感じます。)