在我的MVC服务层中,我有以下代码来验证:
protected bool ValidateAccount(Account account)
{
var accounts = _accountRepository.GetPk(account.PartitionKey);
if (accounts.Any(b => b.Title.Equals(account.Title) &&
!b.RowKey.Equals(account.RowKey)))
_validationDictionary.AddError("", "Duplicate title");
return _validationDictionary.IsValid;
}
然而,在“动作类型”方法中,我使用以下代码吸收异常:
public bool Create(Account account)
{
if (!ValidateAccount(account))
return false;
try
{
_accountRepository.AddOrUpdate(account);
}
catch
{
return false;
}
return true;
}
我的控制器编码如下:
public ActionResult Create(BaseViewModel vm)
{
_accountService = new AccountService(new ModelStateWrapper(this.ModelState), vm.Meta.DataSourceID);
if (ModelState.IsValid)
{
_accountService = new AccountService(new ModelStateWrapper(this.ModelState), vm.Meta.DataSourceID);
if (!_accountService.Create(vm.Account))
return View("CreateEdit", vm);
else
return RedirectToAction("Created");
}
return RedirectToAction("Home");
}
return View("CreateEdit", vm);
}
这是一种合理的方法吗?我唯一担心的是我可能会丢失服务层中的异常信息。
答案 0 :(得分:3)
你应该至少记录你的异常(事件日志,文件系统,使用Elmah等)。
您的代码存在的问题是,您永远不会知道生产环境中是否发生了不良事件,或者您无法确切地发现失败的原因(只是代码返回false)。
另外,你永远不应该像你那样处理所有异常(未经过滤的捕获),而只能处理你可以恢复到正常状态的异常。让应用程序崩溃比让它保持在线不稳定要好得多。
通过在应用程序代码中捕获非特定异常(例如System.Exception,System.SystemException等)来避免处理错误。有些情况下,处理应用程序中的错误是可以接受的,但这种情况很少见。
有关处理例外和MSDN article
的最佳做法,请参阅此Design Guidelines for Exceptions答案 1 :(得分:1)
由于您在服务层的Create方法中没有做任何异常,我建议从中删除try / catch。
我仍然会返回true或false来指示创建操作是否成功。但是,我将在调用者中添加try / catch以确保处理异常。在您的情况下,可能在您的控制器操作(或基本控制器中的OnException)。
另一种方法是将try / catch留在Create方法中,但是@Stephane建议用它做一些事情(比如记录它),但你也可以在任何你捕获它的地方记录它。