ajaxcall 中的错误处理

Posted

技术标签:

【中文标题】ajaxcall 中的错误处理【英文标题】:error handling in an ajaxcall 【发布时间】:2011-01-26 06:36:34 【问题描述】:

我有一个网站,其中 ajax 调用将从 Asp.Net-Mvc 操作中获取一些 Json 数据。

现在我正在尝试在其中进行植入错误处理。

但我不知道该怎么做。

我找到的最简单的方法是在控制器操作中捕获异常,并返回一个带有错误消息的 Json 对象。然后在 ajax succes 函数中,如果它存在,我可以输出错误消息。

但我不确定这是最好的方法,所以我尝试使用 ajax 调用的错误函数。

我的代码是这样的:

$.ajax(
    
       type: "POST",
       url: "/home/geterror",
       data: "",
       dataType: "json",
       success: function(result)
       
           //do something

       ,
       error: function(XMLHttpRequest, textStatus, errorThrown)
       
            alert(XMLHttpRequest.responseText + " "+ XMLHttpRequest.status +" "+ textStatus +" "+ errorThrown);   
       
    );

我看到 XMLHttpRequest.responseText 是一个标准的 asp.net 错误页面,标题中有我的错误消息。 errorThrown 总是未定义的。 现在我试图从 XMLHttpRequest.responseText 中获取标题。但我不知道该怎么做。 (我尝试的一切都失败了..) 因此,如果有人有任何建议或更好的方法来处理 Ajax 调用的错误......

谢谢, 布鲁诺

【问题讨论】:

你不能只从 ASP.NET 发送描述错误的 JSON 对象,并将 HTTP 状态代码设置为一些错误,所以在你的 jQuery 端触发错误函数。 我一开始就在寻找那个,但没有成功,现在因为你的答案在下面,我可以。谢谢! 【参考方案1】:

Bruno,我认为你应该在这里做出区分;您有想要向用户显示的自定义或预期错误,例如提供的无效值,您必须告诉用户“先生,您不能这样做,因为 bla bla”,另一方面,您还有其他意外错误,例如例如,您的代码中的错误会导致一些不需要的异常,例如插入中的 FK 违规。我的建议是全局处理后者,您可以设置查询 ajax 请求以具有一些常见行为,例如ajaxSetup。通过这种方式,您可以设置一个常见的错误处理程序(状态 500)。如果您有“预期”错误(我的示例中的第一种情况),您应该返回一个特殊对象,如 Darin 在他的答案中所示,并在成功回调中处理它,毕竟这是一个有效的场景,您应该处理它就这样。

【讨论】:

预期错误仍然是错误。网络相关或应用相关并不能使操作成功,应按此处理。 Anurag,也许我没有很好地表达自己,我的意思是您通常有替代流程,您必须告诉用户发生了某些事情。例如,假设一个用户忘记了他的密码并想要重置他的密码,并提供了他的电子邮件。如果他输入了不正确的电子邮件(例如不存在的电子邮件),那么您必须将这种情况作为预期情况处理,并在成功回调中处理它。当您遇到意外的 NullReferenceException 或任何其他意外错误时,情况会有所不同。 我明白您在回答中指的是替代流程,但您也可以将它们归类为错误(或异常)。我认为这是一个错误,因为由于任何原因未执行预期的操作(发送电子邮件)。如果这样处理,每个成功回调都不会乱扔if(result.wasSuccessful) .. else .. ,而是错误回调将接管,并根据返回的代码采取适当的行动。 嘿,谢谢你的回答!我已经在成功处理程序中处理“错误邮件”——错误。我正在寻找一个很好的解决方案来在我的 ajax 调用的错误处理程序中捕获真正的 trow 异常。 ajaxsetup 也非常适合这个。【参考方案2】:

error 回调中处理错误处理要好得多。为了让 jQuery 将其检测为错误,您需要将 HTTP response code 设置为某个 4xx 或 5xx。我不了解 ASP.NET,所以请多多包涵,但你需要一些东西来达到这种效果。

Response.code = '401'
Response.text = JSON( message: 'An error occurred.', ... )

在客户端,parse the JSON response。

$.ajax(
    ...
    error: function(request, status, error) 
        var result = JSON.parse(request.responseText);
        alert(result.message);
    );
);

【讨论】:

Thx,我最初是在寻找这样的解决方案,但我没有找到设置响应代码的方法。但我现在找到了。它适用于这个解决方案。【参考方案3】:
public ActionResult Index()

    try
    
        // Do something
        return Json(new  status = true, errorMessage = "" );
    
    catch (SomeSpecialExceptionYouWantToHandle e)
    
        return Json(new  status = false, errorMessage = e.Message );
    

还有 ajax 调用:

$.post('/home/index',  , function(result) 
    if (result.status) 
        alert('success');
     else 
        alert(result.errorMessage);
    
, 'json');

【讨论】:

这是我的第一个解决方案,但我的同事没有找到一个“好的解决方案”,所以我应该关注其他解决方案。但是谢谢!

以上是关于ajaxcall 中的错误处理的主要内容,如果未能解决你的问题,请参考以下文章

Bash 中的错误处理

Rust Web 全栈开发之 Web Service 中的错误处理

学习PDO中的错误与错误处理模式

Playbooks 中的错误处理

SpringBoot 使用 ControllerAdvice 中的自定义错误处理所有错误

javascript中的错误处理机制