JQuery AJAXエラーメッセージでカスタム例外メッセージをアラートとして表示する方法はありますか。
たとえば、throw new ApplicationException("User name already exists");
によって Struts を介してサーバー側で例外をスローしたい場合、jQuery AJAXエラーメッセージでこのメッセージ( 'user name already exists')をキャッチします。
jQuery("#save").click(function () {
if (jQuery('#form').jVal()) {
jQuery.ajax({
type: "POST",
url: "saveuser.do",
dataType: "html",
data: "userId=" + encodeURIComponent(trim(document.forms[0].userId.value)),
success: function (response) {
jQuery("#usergrid").trigger("reloadGrid");
clear();
alert("Details saved successfully!!!");
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
}
});
スローされたエラーをアラートする2番目のアラートでは、undefined
を受け取り、ステータスコードは500です。
どこに問題があるのかよくわかりません。この問題を解決するために何ができますか?
Response.StatusCode
を200以外に設定していることを確認してください。Response.Write
を使用して例外のメッセージを書いてから、...を使用してください。
xhr.responseText
..あなたのジャバスクリプトで。
コントローラー:
public class ClientErrorHandler : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
var response = filterContext.RequestContext.HttpContext.Response;
response.Write(filterContext.Exception.Message);
response.ContentType = MediaTypeNames.Text.Plain;
filterContext.ExceptionHandled = true;
}
}
[ClientErrorHandler]
public class SomeController : Controller
{
[HttpPost]
public ActionResult SomeAction()
{
throw new Exception("Error message");
}
}
スクリプトを表示:
$.ajax({
type: "post", url: "/SomeController/SomeAction",
success: function (data, text) {
//...
},
error: function (request, status, error) {
alert(request.responseText);
}
});
サーバ側:
doPost(HttpServletRequest request, HttpServletResponse response){
try{ //logic
}catch(ApplicationException exception){
response.setStatus(400);
response.getWriter().write(exception.getMessage());
//just added semicolon to end of line
}
}
クライアント側:
jQuery.ajax({// just showing error property
error: function(jqXHR,error, errorThrown) {
if(jqXHR.status&&jqXHR.status==400){
alert(jqXHR.responseText);
}else{
alert("Something went wrong");
}
}
});
一般的なAjaxエラー処理
すべてのajaxリクエストに対して一般的なエラー処理を行う必要がある場合私はajaxErrorハンドラを設定し、HTMLコンテンツの上にあるerrorcontainerというdivにエラーを表示します。
$("div#errorcontainer")
.ajaxError(
function(e, x, settings, exception) {
var message;
var statusErrorMap = {
'400' : "Server understood the request, but request content was invalid.",
'401' : "Unauthorized access.",
'403' : "Forbidden resource can't be accessed.",
'500' : "Internal server error.",
'503' : "Service unavailable."
};
if (x.status) {
message =statusErrorMap[x.status];
if(!message){
message="Unknown Error \n.";
}
}else if(exception=='parsererror'){
message="Error.\nParsing JSON Request failed.";
}else if(exception=='timeout'){
message="Request Time out.";
}else if(exception=='abort'){
message="Request was aborted by the server";
}else {
message="Unknown Error \n.";
}
$(this).css("display","inline");
$(this).html(message);
});
responseText
をJSONに変換する必要があります。 JQueryを使う:
jsonValue = jQuery.parseJSON( jqXHR.responseText );
console.log(jsonValue.Message);
Asp.netを呼び出すと、エラーメッセージタイトルが返されます。
私は自分自身でformatErrorMessageをすべて書いたわけではありませんが、とても便利だと思います。
function formatErrorMessage(jqXHR, exception) {
if (jqXHR.status === 0) {
return ('Not connected.\nPlease verify your network connection.');
} else if (jqXHR.status == 404) {
return ('The requested page not found. [404]');
} else if (jqXHR.status == 500) {
return ('Internal Server Error [500].');
} else if (exception === 'parsererror') {
return ('Requested JSON parse failed.');
} else if (exception === 'timeout') {
return ('Time out error.');
} else if (exception === 'abort') {
return ('Ajax request aborted.');
} else {
return ('Uncaught Error.\n' + jqXHR.responseText);
}
}
var jqxhr = $.post(addresshere, function() {
alert("success");
})
.done(function() { alert("second success"); })
.fail(function(xhr, err) {
var responseTitle= $(xhr.responseText).filter('title').get(0);
alert($(responseTitle).text() + "\n" + formatErrorMessage(xhr, err) );
})
これは私がしたことであり、MVC 5アプリケーションでこれまでのところうまくいきます。
コントローラの戻り型はContentResultです。
public ContentResult DoSomething()
{
if(somethingIsTrue)
{
Response.StatusCode = 500 //Anything other than 2XX HTTP status codes should work
Response.Write("My Message");
return new ContentResult();
}
//Do something in here//
string json = "whatever json goes here";
return new ContentResult{Content = json, ContentType = "application/json"};
}
そしてクライアント側では、これはajax関数がどのように見えるかです。
$.ajax({
type: "POST",
url: URL,
data: DATA,
dataType: "json",
success: function (json) {
//Do something with the returned json object.
},
error: function (xhr, status, errorThrown) {
//Here the status code can be retrieved like;
xhr.status;
//The message added to Response object in Controller can be retrieved as following.
xhr.responseText;
}
});
誰かがその答えを求めて2016年のようにここにいるなら、jQuery 3.0では.fail()
は非推奨であるのでエラー処理のために.error()
を使ってください
$.ajax( "example.php" )
.done(function() {
alert( "success" );
})
.fail(function(jqXHR, textStatus, errorThrown) {
//handle error here
})
それが役立つことを願っています
この答えは、この問題にぶつかるすべての人々への将来の参照のために提供されています。解決策は2つのことから成り立っています。
ModelStateException
は、検証がサーバー上で失敗したときにスローされます(データアノテーションを使用し、厳密な型付きコントローラーアクションパラメーターを使用すると、モデル状態が検証エラーを報告します)HandleModelStateExceptionAttribute
はカスタム例外をキャッチし、本体のモデル状態エラーとともにHTTPエラーステータスを返しますこれは、jQuery Ajax呼び出しがsuccess
およびerror
ハンドラーでその潜在能力を最大限に引き出すための最適なインフラストラクチャーを提供します。
$.ajax({
type: "POST",
url: "some/url",
success: function(data, status, xhr) {
// handle success
},
error: function(xhr, status, error) {
// handle error
}
});
[HandleModelStateException]
public ActionResult Create(User user)
{
if (!this.ModelState.IsValid)
{
throw new ModelStateException(this.ModelState);
}
// create new user because validation was successful
}
問題全体は このブログ記事 で詳しく説明されています。ここでは、アプリケーションでこれを実行するためのすべてのコードを見つけることができます。
サーバーから送信していたメッセージを解析し、ユーザーにわかりやすいメッセージをスタックトレースなしで表示できるので、これはいいと思いました...
error: function (response) {
var r = jQuery.parseJSON(response.responseText);
alert("Message: " + r.Message);
alert("StackTrace: " + r.StackTrace);
alert("ExceptionType: " + r.ExceptionType);
}
これはおそらくJSONフィールド名に引用符が付いていないことが原因です。
JSON構造を次のように変更します。
{welcome:"Welcome"}
に:
{"welcome":"Welcome"}
jQuery.parseJSONは成功とエラーに役立ちます。
$.ajax({
url: "controller/action",
type: 'POST',
success: function (data, textStatus, jqXHR) {
var obj = jQuery.parseJSON(jqXHR.responseText);
notify(data.toString());
notify(textStatus.toString());
},
error: function (data, textStatus, jqXHR) { notify(textStatus); }
});
私はAjaxレスポンスハンドラがHTTPステータスコードを使ってエラーがあるかどうかをチェックしていると思います。
したがって、サーバーサイドコードでJava例外をスローしただけで、HTTP応答に500のステータスコードjQuery(またはこの場合は XMLHttpRequest オブジェクト)が含まれていない場合は、すべて問題ないと見なされます。
私はこれを言っています私はArgumentExceptionのような何かを投げていたASP.NETで同様の問題を抱えていたので( "どうしたらいいかわからない...")エラーハンドラは起動しませんでした。
それから、エラーがあったかどうかにかかわらず、Response.StatusCode
を500または200に設定しました。
あなたは、xhrオブジェクトの中で、投げられた例外のJSONオブジェクトを持っています。ただ使う
alert(xhr.responseJSON.Message);
JSONオブジェクトは他の2つのプロパティを公開します: 'ExceptionType'と 'StackTrace'
error:function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
といった
success: function(data){
// data is object send form server
// property of data
// status type boolean
// msg type string
// result type string
if(data.status){ // true not error
$('#api_text').val(data.result);
}
else
{
$('#error_text').val(data.msg);
}
}
$("#save").click(function(){
$("#save").ajaxError(function(event,xhr,settings,error){
$(this).html{'error: ' (xhr ?xhr.status : '')+ ' ' + (error ? error:'unknown') + 'page: '+settings.url);
});
});
以下を使用してサーバーに新しい例外をスローします。
Response.StatusCode = 500
Response.StatusDescription = ex.Message()
StatusDescriptionはAjaxの呼び出しに返されると思います。
例:
Try
Dim file As String = Request.QueryString("file")
If String.IsNullOrEmpty(file) Then Throw New Exception("File does not exist")
Dim sTmpFolder As String = "Temp\" & Session.SessionID.ToString()
sTmpFolder = IO.Path.Combine(Request.PhysicalApplicationPath(), sTmpFolder)
file = IO.Path.Combine(sTmpFolder, file)
If IO.File.Exists(file) Then
IO.File.Delete(file)
End If
Catch ex As Exception
Response.StatusCode = 500
Response.StatusDescription = ex.Message()
End Try
この質問がされてから何年も経ちましたが、私が探していた答えとしてxhr.responseText
がまだ見つかりません。次の形式で文字列を返しました。
"{"error":true,"message":"The user name or password is incorrect"}"
私は間違いなくユーザーに見せたくない。探していたのは以下のようなものです。
alert(xhr.responseJSON.message);
xhr.responseJSON.message
はJsonオブジェクトからの正確なメッセージをユーザーに見せることができます。
$("#fmlogin").submit(function(){
$("#fmlogin").ajaxError(function(event,xhr,settings,error){
$("#loading").fadeOut('fast');
$("#showdata").fadeIn('slow');
$("#showdata").html('Error please, try again later or reload the Page. Reason: ' + xhr.status);
setTimeout(function() {$("#showdata").fadeOut({"opacity":"0"})} , 5500 + 1000); // delays 1 sec after the previous one
});
});
何かフォームがあればvalidateで送信
単に残りのコードを使う
$("#fmlogin").validate({...
...
...
});
この関数は基本的に一意のランダムなAPIキーを生成し、そうでない場合はエラーメッセージ付きのポップアップダイアログボックスが表示されます
内の表示ページ:
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-storename"><?php echo $entry_storename; ?></label>
<div class="col-sm-6">
<input type="text" class="apivalue" id="api_text" readonly name="API" value="<?php echo strtoupper(substr(md5(Rand().microtime()), 0, 12)); ?>" class="form-control" />
<button type="button" class="changeKey1" value="Refresh">Re-Generate</button>
</div>
</div>
<script>
$(document).ready(function(){
$('.changeKey1').click(function(){
debugger;
$.ajax({
url :"index.php?route=account/apiaccess/regenerate",
type :'POST',
dataType: "json",
async:false,
contentType: "application/json; charset=utf-8",
success: function(data){
var result = data.sync_id.toUpperCase();
if(result){
$('#api_text').val(result);
}
debugger;
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
});
});
</script>
コントローラーから:
public function regenerate(){
$json = array();
$api_key = substr(md5(Rand(0,100).microtime()), 0, 12);
$json['sync_id'] = $api_key;
$json['message'] = 'Successfully API Generated';
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
オプションのcallbackパラメータは、load()メソッドが完了したときに実行されるコールバック関数を指定します。コールバック関数は異なるパラメータを持つことができます。
タイプ:関数(jqXHR、jqXHR、文字列textStatus、文字列errorThrown)
要求が失敗した場合に呼び出される関数。 この関数は3つの引数を受け取ります:jqXHR(jQuery 1.4.xでは、XMLHttpRequest)オブジェクト、発生したエラーのタイプを説明する文字列、および発生した場合はオプションの例外オブジェクト2番目の引数に有効な値(null以外)は、 "timeout"、 "error"、 "abort"、および "parsererror"です。 HTTPエラーが発生すると、errorThrownはHTTPステータスのテキスト部分(「見つかりません」や「内部サーバーエラー」など)を受け取ります。 jQuery 1.5以降、エラー設定は関数の配列を受け入れることができます。各関数は順番に呼び出されます。注:このハンドラーは、クロスドメインスクリプトおよびクロスドメインJSONP要求に対しては呼び出されません。
まず、web.configで<serviceDebug includeExceptionDetailInFaults = "True" />を設定する必要があります。
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
**<serviceDebug includeExceptionDetailInFaults="true" />**
</behavior>
</serviceBehaviors>
エラー部分のjqueryレベルでのそれに加えて、次のような例外を含むエラー応答を解析する必要があります。
.error(function (response, q, t) {
var r = jQuery.parseJSON(response.responseText);
});
その後、r.Messageを使用して、例外テキストを正確に表示できます。
完全なコードを確認してください: http://www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html