gpt4 book ai didi

c# - Controller 中的异常处理 (ASP.NET MVC)

转载 作者:IT王子 更新时间:2023-10-29 04:33:26 24 4
gpt4 key购买 nike

当您自己的代码从 Controller 中的操作调用时抛出异常时,应该如何处理?我看到很多根本没有 try-catch 语句的最佳实践示例。例如,从存储库访问数据:

public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}

很明显,如果调用的是它无法访问的数据库并且我们使用的是 Entity Framework 之类的 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 类中,该类处理错误并返回消息以向用户显示消息。

我想知道处理这个问题的最佳方法是什么?我并不总是想返回错误页面,因为有些异常不应该这样做。相反,应该以普通 View 向用户显示一条错误消息。我之前的方法是否正确,或者是否有更好的解决方案?

最佳答案

我做了三件事来显示更加用户友好的消息:

  1. 利用全局异常处理程序。对于 MVC:Global.asax 中的 Application_Error。在此处了解如何使用它:http://msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspx
  2. 我将 Exception 子类化为 UserFriendlyException。我在我所有的底层服务类中尽我最大努力抛出这个 UserFriendlyException 而不是一个普通的旧异常。我总是尝试在这些自定义异常中加入对用户有意义的消息。其主要目的是能够对 Application_Error 方法中的异常进行类型检查。对于 UserFriendlyExceptions,我只使用我在服务中设置的用户友好消息,例如“嘿!91 度不是有效的纬度值!”。如果是常规异常,则表示我没有处理某些情况,因此我会显示一条更通用的错误消息,例如“糟糕,出了点问题!我们会尽力解决这个问题!”。
  3. 我还创建了一个 ErrorController,负责呈现用户友好的 View 或 JSON。这是将从 Application_Error 方法调用其方法的 Controller 。

编辑:我想我会提到 ASP.NET Web API,因为它密切相关。因为 Web API 端点的使用者不一定是浏览器,所以我喜欢以稍微不同的方式处理错误。我仍然使用“FriendlyException”(上面的#2),但我没有重定向到 ErrorController,而是让我的所有端点返回某种包含 Error 属性的基本类型。因此,如果异常一直冒泡到 Web API Controller ,我确保将该错误粘贴到 API 响应的 Error 属性中。此错误消息要么是从 API Controller 所依赖的类中冒出的友好消息,要么是一般消息(如果异常类型不是 FriendlyException)。这样,消费客户端可以简单地检查 API 响应的 Error 属性是否为空。如果存在错误,则显示一条消息,如果没有,则照常进行。好消息是,由于友好的消息概念,消息对用户来说可能比一般的“错误!”更有意义。信息。我在使用 Xamarin 编写移动应用程序时使用了这种策略,我可以在其中在我的 Web 服务和我的 iOS/Android 应用程序之间共享我的 C# 类型。

关于c# - Controller 中的异常处理 (ASP.NET MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17046351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com