C# 什么是最好的&;在MVC中通过AJAX处理异常的最简单方法?

C# 什么是最好的&;在MVC中通过AJAX处理异常的最简单方法?,c#,ajax,asp.net-mvc,error-handling,exception-handling,C#,Ajax,Asp.net Mvc,Error Handling,Exception Handling,我有一个MVC5项目,需要使用可用于所有控制器或操作方法的自定义方法来处理异常。为了解决这个问题,我在上面找到了一些示例,并尝试使用如下所示的方法: 自定义属性: public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { filterContext.Excep

我有一个MVC5项目,需要使用可用于所有控制器或操作方法的自定义方法来处理异常。为了解决这个问题,我在上面找到了一些示例,并尝试使用如下所示的方法:

自定义属性:

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);
        }
    }
});
控制器:

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);
        }
    }
});
查看:

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
            }
        }
//在DAL层中
尝试
{
//插入
}
catch(SqlException-ex)
{

如果(ex.Number==2627)/ExceptionContext.Exception将包含抛出的异常,如果其中没有足够的信息,则可能是因为您没有提供该异常(根据示例代码,仅提供异常消息)

处理应用程序级别过滤器中的所有异常听起来很棒,直到您需要处理特殊情况。并非所有错误都是相等的。异常也是昂贵的,最好考虑从控制器动作中返回有意义的错误对象,并用适当的HTTP响应代码来标识问题。p> 我相信您已经意识到了,但向浏览器显示完整的异常消息、调用堆栈等可能并不明智,因为它可能会揭示应用程序的设计和结构,可能会让攻击者识别漏洞


将原始异常数据发回会将错误提供给通常最无法处理的人:用户。我强烈建议记录异常,然后向用户发送有意义的消息,但不要泄露有关应用程序的敏感信息。

谢谢,但我不想使用try-catch,因为它是不可重用的。@binary如果您不想使用try-catch,您可以使用from-AOP方法进行可重用的异常处理,或者检查您的web层中的异常类型,并做出有意义的更改exception@binary对于Aop样本,您可以切掉这个Postsharp样本,非常感谢,但这并不是我所寻找的方法。我知道我的问题中有一个类似的例子。还有其他想法吗?@binary我说你可以在过滤器OneException中检查你的异常类型,并生成一个有意义的异常