【问题标题】:What is the best & easiest way for Exception Handling via AJAX in MVC?在 MVC 中通过 AJAX 处理异常的最佳和最简单的方法是什么?
【发布时间】:2017-01-28 19:08:12
【问题描述】:

我有一个 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 中没有足够的信息作为有意义的消息或异常类型返回给视图,即“数据库约束错误等”。那么,有没有更好的方法来提供有关异常的详细信息并在本示例中使用 JSON。

【问题讨论】:

    标签: c# ajax asp.net-mvc error-handling exception-handling


    【解决方案1】:

    对于有意义的异常,您必须使用自定义消息创建自定义异常或新异常,例如

    //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 层使用自定义消息获取您的异常。您可以向用户显示您的自定义消息并为开发人员记录原始异常消息。

    【讨论】:

    • 谢谢,但我不想使用 try-catch,因为它不可重复使用。
    • @binary 如果你不想使用 try catch,你可以使用 AOP 方法来进行可重用的异常处理或检查 Web 层中的异常类型并生成有意义的异常
    • @binary for Aop 示例,您可以查看此 Postsharp 示例 doc.postsharp.net/exception-handling
    • 非常感谢,但这并不是我正在寻找的方法。我需要一个与我的问题类似的例子。还有其他想法吗?
    • @binary 我说你可以在你的过滤器 OnException 中检查你的异常类型并做出一个有意义的异常
    【解决方案2】:

    ExceptionContext.Exception 将包含抛出的异常,如果其中没有足够的信息,那么可能是因为您没有提供它(基于示例代码,仅提供了异常消息)。

    在应用程序级过滤器中处理所有异常听起来很棒,除非您有需要解决的特殊情况。并非所有错误都是平等的。异常也很昂贵,最好考虑从控制器操作返回有意义的错误对象,并使用适当的 HTTP 响应代码来识别问题。

    我确定您已经知道,但是将完整的异常消息、调用堆栈等显示给浏览器可能并不明智,因为它可以揭示您的应用程序的设计和结构,从而可能让攻击者识别漏洞。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多