我有一个抛出异常的控制器作为例子:
[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错误客户端,如果这是处理错误的推荐方法。
答案 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
});