当您自己的代码抛出异常并从控制器中的操作调用时,应该如何处理?我看到很多最佳实践的例子,其中根本没有 try-catch 语句。例如,从存储库访问数据:
public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}
显然,如果调用的是它无法访问的数据库,并且我们正在使用像实体框架这样的 ORM,则此代码可能会引发异常。
然而,我所看到的只是异常会冒出来并向用户显示一条令人讨厌的错误消息。
我知道 HandleError 属性,但我知道它主要用于在发生未处理的异常时将您重定向到错误页面。
当然,这段代码可以包含在 try-catch 中,但不能很好地分离,特别是如果您有更多逻辑:
public ViewResult Index()
{
if (ValidationCheck())
{
IList<CustomModel> customModels = new List<CustomModel>();
try
{
customModels = _customModelRepository.GetAll();
}
catch (SqlException ex)
{
// Handle exception
}
if (CustomModelsAreValid(customModels))
// Do something
else
// Do something else
}
return View();
}
之前,我已经提取了所有可能引发异常的代码,例如将数据库调用放入 DataProvider 类中,该类处理错误并返回消息以向用户显示消息。
我想知道处理这个问题的最佳方法是什么?我并不总是想返回错误页面,因为某些异常不应该这样做。相反,应使用正常视图向用户显示错误消息。我之前的方法正确还是有更好的解决方案?
我做了三件事来显示更多用户友好的消息:
- 利用全局异常处理程序。对于 MVC:Global.asax 中的 Application_Error。在这里了解如何使用它:http://msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/24395wz3%28v=vs.100%29.aspx
- 我将 Exception 子类化为 UserFriendlyException。我尽最大努力在所有底层服务类中抛出此 UserFriendlyException 而不是普通的旧异常。我总是尝试将对用户有意义的消息放入这些自定义异常中。其主要目的是能够对Application_Error方法中的异常进行类型检查。对于 UserFriendlyExceptions,我只使用我在服务中深入设置的用户友好消息,例如“嘿!91 度不是有效的纬度值!”。如果这是常规异常,那么这是我尚未处理的情况,因此我会显示更通用的错误消息,例如“哎呀,出了问题!我们会尽力修复该问题!”。
- 我还创建了一个 ErrorController 来负责渲染用户友好的视图或 JSON。这是将从 Application_Error 方法调用其方法的控制器。
EDIT:我想我应该提及 ASP.NET Web API,因为它密切相关。因为 Web API 端点的使用者不一定是浏览器,所以我喜欢以稍微不同的方式处理错误。我仍然使用“FriendlyException”(上面#2),但我没有重定向到 ErrorController,而是让所有端点返回某种包含 Error 属性的基本类型。因此,如果异常一直冒泡到 Web API 控制器,我会确保将该错误保留在 API 响应的 Error 属性中。此错误消息要么是从 API 控制器所依赖的类中冒出的友好消息,要么是通用消息(如果异常类型不是FriendlyException)。这样,使用方客户端可以简单地检查 API 响应的 Error 属性是否为空。如果存在错误,则显示一条消息;如果不存在,则照常继续。好处是,由于友好的消息概念,该消息对用户来说可能比通用的“错误!”更有意义。信息。我在使用 Xamarin 编写移动应用程序时使用此策略,我可以在 Web 服务和 iOS/Android 应用程序之间共享我的 C# 类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)