我有一个MVC5项目,需要通过使用可用于所有Controller或Action方法的自定义方法来处理异常。为了解决这个问题,我发现了Exception handling in 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中没有足够的信息作为有意义的消息返回View或者异常类型即#34;数据库约束错误等等#34 ;那么,是否有更好的方法可以获得有关异常和使用JSON的详细信息,如本例所示。
答案 0 :(得分:0)
对于有意义的异常,您必须使用自定义消息(如
)进行自定义异常或新异常//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层中使用自定义消息获取异常。您可以向用户显示自定义消息并为开发人员记录原始异常消息。
答案 1 :(得分:0)
ExceptionContext.Exception将包含抛出的异常,如果没有足够的信息,那么可能是因为你没有提供它(基于示例代码,只提供了异常消息)。
在您遇到需要解决的特殊情况之前,处理应用程序级过滤器中的所有异常听起来都很棒。并非所有错误都是平等的。例外情况也很昂贵,考虑从控制器操作发回有意义的错误对象可能会更好,并使用适当的HTTP响应代码识别问题。
我确信您已经知道,但是向浏览器显示完整的异常消息,调用堆栈等可能并不明智,因为它可以揭示应用程序的设计和结构,可能允许攻击者识别漏洞。
发送原始异常数据会向通常最不能对其执行操作的人员提供错误:用户。我强烈建议记录异常,然后向用户发送有意义的消息,但不得泄漏有关您应用的敏感信息。