什么是最好的?在MVC中通过AJAX进行异常处理的最简单方法
本文关键字:AJAX 最简单 异常处理 方法 MVC 什么 | 更新日期: 2023-09-27 18:08:01
我有一个MVC5项目,需要通过使用可用于所有控制器或动作方法的自定义方法来处理异常。为了解决这个问题,我发现了一些在ASP异常处理上发布的例子。. NET MVC,并尝试使用如下所示的方法:
自定义属性:
public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
{
Data = new { success = false, error = filterContext.Exception.ToString() },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
控制器:
[MyErrorHandler]
public ActionResult Delete(int id)
{
Course deletedCourse = repository.DeleteCourse(id);
if (deletedCourse == null)
{
throw new Exception("Error...");
}
}
视图:
$.ajax({
//code omitted for brevity
success: function (result, textStatus, XMLHttpRequest) {
if (!result.success) {
alert(result.error);
}
}
});
虽然这种方法工作正常,但在filterContext中没有足够的信息作为有意义的消息或异常类型返回给视图。"数据库约束错误等。"那么,是否有更好的方法拥有关于异常的详细信息,并像本例中那样使用JSON。
对于有意义的异常,您必须使用自定义消息创建自定义异常或新异常,如
//In DAL layer
try
{
// do your insert
}
catch (SqlException ex)
{
if (ex.Number == 2627) // <-- but this will
{
throw new Exception("Your Custom mesage",ex);
//Violation of primary key. Handle Exception
}
}
你必须抛出你的异常,并在Web层获得你的异常与自定义消息。您可以向用户显示自定义消息,并为开发人员记录原始异常消息。
例外上下文。异常将包含抛出的异常,如果其中没有足够的信息,则可能是因为您没有提供它(根据示例代码,只提供了异常消息)。
在应用程序级过滤器中处理所有异常听起来很棒,直到遇到需要处理的特殊情况。并不是所有的错误都是一样的。异常也很昂贵,最好考虑从控制器动作发送有意义的错误对象,并使用适当的HTTP响应代码标识问题。
我相信你已经意识到,但是将完整的异常消息,调用堆栈等呈现给浏览器可能不明智,因为它可以揭示你的应用程序的设计和结构,可能允许攻击者识别漏洞。
将原始异常数据发回将错误提供给通常最无力对此采取措施的人:用户。我强烈建议记录异常,然后向用户发送有意义的消息,但不要泄露应用的敏感信息。