【问题标题】:How can I handle all possible exceptions when I do a POST with EF6 / SQL Server 2012使用 EF6/SQL Server 2012 进行 POST 时如何处理所有可能的异常
【发布时间】:2026-01-30 17:10:01
【问题描述】:

当我提交新条目时,我在控制器中使用以下代码:

    // POST /api/Content/
    public HttpResponseMessage PostContent(Content content)
    {
        try
        {
            content.ModifiedDate = DateTime.Now;
            _uow.Contents.Add(content);
            _uow.Commit();
            var response = Request.CreateResponse<Content>(HttpStatusCode.Created, content);
            return response;
        }
        catch (DbUpdateException ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.Conflict, ex);
        } 
    }

这只会获取 DbUpdateExceptions,所以如果有另一种异常,那么我认为我需要以不同的方式处理它。

谁能建议我应该如何处理其他异常?

【问题讨论】:

  • 尝试分离您的层,以便您的 DataAccess 层可以捕获它自己的错误,记录它们并向调用者抛出一个友好的消息或更一般的异常。从那里您可以捕获该错误并按照您的选择进行操作。
  • 谁能建议我应该如何处理其他异常? 处理那些你可以有意义的异常(例如DbUpdateException),否则为 MVC 处理 use the HandleErrorAttribute

标签: sql-server asp.net-mvc entity-framework


【解决方案1】:

您可以连续添加多个捕获,从最特殊到最一般

try
{
      content.ModifiedDate = DateTime.Now;
      _uow.Contents.Add(content);
      _uow.Commit();
      var response = Request.CreateResponse<Content>(HttpStatusCode.Created, content);
      return response;
}
catch (DbUpdateException ex)
{
     return Request.CreateErrorResponse(HttpStatusCode.Conflict, ex);
} 
catch (Exception ex)
{
     // do what you want
} 

【讨论】:

    【解决方案2】:

    如果我们想从快速而肮脏的方法转移到更长但更安全的方法,我们可以通过以下步骤:

    1. 在单独的对象中封装数据访问并处理其中的异常,将自定义异常传递给外界。您可以决定在单个自定义异常下隐藏所有数据访问异常。

    2. (正如@Massanu 指出的那样)连接从最特殊到最一般的处理程序。要对不同的异常做出适当的反应,请不要使用单个 catch (Exception ex) 处理程序。

    3. 如果某些事情,实际上,让未处理,您可以在Application_Errorglobal.asax 方法中捕获它:http://msdn.microsoft.com/ru-ru/library/24395wz3(v=vs.100).aspx

    Steve Macconell 写的 Code Complete 书中有一个关于错误处理的好章节:http://cc2e.com/

    【讨论】: