2013-08-01 24 views
2

我迷失在什么/哪里/何时应该在我的asp.net mvc web应用程序中捕获异常。以及如何为最终用户显示错误消息。例如我得到了以下操作方法: -从我的模型类捕捉异常的最佳方法

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(ServerToEdit serverToEdit) 
     { 
try 
     { 
     if (ModelState.IsValid) 
     { 
     if (!(repository.IsIPUnique(serverToEdit.TechnologyIP.IPAddress, 0))) 
     { 
     ModelState.AddModelError("TechnologyIP.IPAddress", "Error occured. The Same IP might already assinged."); 

          return View(serverToEdit); 
     } 
     if (!(repository.IsServerNameUnique(serverToEdit.Server.Name, 0))) 
     { 
     ModelState.AddModelError("Server.Name", "Error occured. The Same Server Name might already assinged."); 

          return View(serverToEdit); 
         } 
         repository.InsertOrUpdateServer(serverToEdit.Server,serverToEdit.TechnologyIP,User.Identity.Name); 
         repository.Save(); 
         return RedirectToAction("Index"); 
        } 

     else 
     { 
     return View(serverToEdit); 
     } 
     } 
    catch (DbUpdateException) 
     { 
     ModelState.AddModelError(string.Empty, "Error occured. The Same IP/Name might already assinged."); 

     } 
    catch (DbEntityValidationException) 
        { 
         ModelState.AddModelError(string.Empty, "Error occured. User might not be defiend inside Active Directory."); 

        } 
     return View(serverToEdit); 
     } 

我有一个关于我的代码如下问题: -

  1. 我有两个服务的方法(IsIPUnique & IsServeNameUnique);但是Controller操作方法是从我的存储库模型类中调用这些服务方法的最佳位置?

  2. 当前如果服务方法失败,我手动编写模型状态错误并将视图返回给用户。那么这是为服务方法编写模型状态错误的正确方法吗?

  3. 如果引发DBUpdateException,我假设IP或serve-name已存在于数据库中(如果服务方法无法检查高流量应用程序,则可能发生这种情况)。但DBUpdateExceptio有很多其他原因需要提出。所以我的问题是关于什么是处理DBUpdateException的最佳方法。并显示它被提出的原因是什么?

回答

1

我想你可以添加其他层封装了电话,并找回了一些状态,如果任何错误的结果,并与返回的消息失败的情况下使用的ModelState,这样您的控制器将更具可读性。

2

控制器通常是进行模型状态验证的正确位置,但正如我发现的那样,如果您正在进行大量验证,那么它可能会使控制器容易膨胀。

我如何处理验证繁重的控制器方法是将验证导出到服务,比如称为ValidateServer(serverToEdit)的静态方法。

然后在这个方法里面,运行你所有的各种检查,并建立一个名为errors的字典,如果检查失败,给这个字典添加一个错误。

然后,您可以将此字典传回给您的控制器,并使用foreach将错误添加到ModelState中。然后这只会让你处理异常。

为了提供DBUpdateException中的用户信息,您应该能够通过例外.InnerException属性获取有关其发生原因的信息,您可以将该属性作为错误消息传递给用户。所以你会写:

catch (DbEntityValidationException ex) 
       { 
        ModelState.AddModelError(string.Empty, "Error occurred:" + ex.InnerException); 

       } 

或沿着这些线路的东西!

+0

感谢您的回复。但我认为ex.InnerException将包含一个技术错误描述。所以向用户显示该错误是正常的,或者在将这些错误显示给用户之前,它们将很好地处理这些错误。 –

2

不要混合验证和异常处理。

在一个集中的地方处理异常并记录并向最终用户显示错误更有意义。这样,您可以使您的代码更具可读性和可维护性。 CodeProject在这个主题上有a great article