如何构建我的代码,以便在AJAX调用中获取异常?

时间:2016-04-13 05:00:07

标签: angularjs ajax asp.net-mvc model-view-controller

我有一个抛出异常的控制器作为例子:

   [HttpPost]
    public JsonResult RetrieveTransactionStatuses() {
        throw new Exception("Test exceptioN");
        return this.Json(this.RetrieveStatusLines());
    }

我使用角度脚本调用上面的内容:

 $http.post('/Status/RetrieveTransactionStatuses')
        .then(function (response) {
            // success
            console.log('on success');
            vm.statusLines = response.data;
        },
        function () {
            // failure
            console.log('on failure');
            ExceptionHandlers.Methods.ShowError('Error Retrieving Data!', 'There has been an error retrieving the status data');
        });

但是,控制器中的上述方法将返回具有200 OK状态的页面。有没有办法区分POST方法,然后让它返回正确的HTTP错误状态代码(500)?

基本上,在post方法出错后,我会在对话框中弹出警告,通知发生了错误。

我应该覆盖控制器中的OnException()方法还是有更好的方法来处理它?如果没有,我如何能够识别请求是Get还是Post方法?

如果可能的话,我想处理所有POST错误客户端,如果这是处理错误的推荐方法。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是捕获异常并发送可以解释为错误的响应。如下所示:

[HttpPost]
public JsonResult RetrieveTransactionStatuses() 
{
    object responseObject = null; 

    try
    {
        // your code that might raise an exception
        var statusLines = RetrieveStatusLines();

        // a type should be defined to ensure an homogeneous structure for the response 
        var ret = new 
            { 
                IsError = false,
                ErrorMessage = String.Empty,
                Data = statusLines 
            };
        return Json(ret);
    }
    // multiple catch handler may be used based on expected exception types
    catch (Exception exc)
    {
        // log the error in some place (file, database etc.)

        var ret = new 
            { 
                IsError = true,
                ErrorMessage = "RetrieveTransactionStatuses failed",
                Data = null         // this is irrelevant
            };
        return Json(ret);
    }
}

这可以确保控制错误发送到Angular的方式,也可以在想要显示预期错误(非例外)时使用。

以防万一,在Angular中,您应该考虑定义this之类的请求,以涵盖与异常无关的错误,并且还有机会执行一些代码而不管错误/成功。

 $http.post('/Status/RetrieveTransactionStatuses')
        .then(function (response) {
            // success
            console.log('on success');
            vm.statusLines = response.data;
        }
        .error(function (data, status) {
            // Handle HTTP error - now only for other causes that your exceptions
        })
        .finally(function () {
            // Execute logic independent of success/error
        })
        .catch(function (error) {
            // Catch and handle exceptions from success/error/finally functions
        });