当前位置: 首页 > 编程语言 > C#

Controller中的异常处理(ASP.NETMVC)分享

时间:2023-04-11 02:41:31 C#

Controller中的异常处理(ASP.NETMVC)当你自己的代码在controller中调用操作抛出异常时怎么办?我看到许多根本没有try-catch语句的最佳实践示例。例如,从存储库访问数据:publicViewResultIndex(){IListcustomModels=_customModelRepository.GetAll();返回视图(自定义模型);显然,如果对无法访问的数据库进行调用,并且我们正在使用类似EntityFrameworkORM的东西,则此代码可能会抛出异常。然而,我所看到的只是发生了异常,并且向用户显示了一条烦人的错误消息。我知道HandleError属性,但据我所知,它主要用于在发生未处理的异常时将您重定向到错误页面。当然,这段代码可以包含在一个try-catch中,但它不能很好地分开,尤其是当你有更多逻辑时:publicViewResultIndex(){if(ValidationCheck()){尝试{customModels=_customModelRepository.GetAll();}catch(SqlExceptionex){//处理异常}if(CustomModelsAreValid(customModels))//做其他事情//做其他事情}returnView();将任何可能引发异常的代码(如数据库调用)提取到处理错误并返回消息以显示给用户的DataProvider类中。我想知道处理这个问题的最佳方法是什么?我并不总是想返回一个错误页面,因为有些异常不应该。相反,应该在普通视图中显示给用户的错误消息。我之前的做法是正确的还是有更好的解决方案?我做了三件事来显示更加用户友好的消息:使用全局异常处理程序。对于MVC:Global.asax中的Application_Error。在此处了解如何使用它:http://msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspx我将Exception子类化为UserFriendlyException。我尽我所能在我所有的底层服务类中抛出这个UserFriendlyException而不是一个普通的旧异常。我总是尝试在这些自定义异常中放置对用户有意义的消息。它的主要目的是在Application_Error方法中启用异常类型检查。对于UserFriendlyExceptions,我只使用我在服务中设置的用户友好消息,例如“嘿!91度不是有效的纬度值!”。如果它是常规异常,那么在某些情况下我不会处理它,所以我会显示更通用的错误消息,例如“糟糕,出了点问题!我们会尽力修复它!”。我还创建了一个ErrorController负责呈现用户友好的视图或JSON。这是将从Application_Error方法调用其方法的控制器。编辑:我想我会提到ASP.NETWebAPI,因为它密切相关。因为WebAPI端点的消费者不一定是浏览器,所以我有点喜欢处理错误。我仍然使用“FriendlyException”(上面的#2),但我没有重定向到ErrorController,而是让我的所有端点返回某种包含Error属性的基本类型。因此,如果异常一直传到WebAPI控制器,我确保将该错误粘贴到API响应的Error属性中。此错误消息将是从API控制器所依赖的类中冒出的友好消息,或者如果异常类型不是FriendlyException,则它将是通用消息。这样,使用客户端可以简单地检查API响应的Error属性是否为空。如果有错误则显示一条消息,否则照常进行。好消息是消息对用户来说比一般的“错误!”更有意义。感谢友好的消息概念。信息。我在使用Xamarin编写移动应用程序时使用此策略,我可以在我的Web服务和iOS/Android应用程序之间共享我的C#类型。使用Asp.NetMVC,您还可以覆盖控制器的OnException方法。protectedoverridevoidOnException(ExceptionContextfilterContext){if(filterContext.ExceptionHandled){返回;}filterContext.Result=newViewResult{ViewName=...};filterContext.ExceptionHandled=true;这允许您重定向到自定义错误页面,如果您愿意,可以使用一条引用异常的消息。我使用OnException覆盖是因为我有几个项目引用了一个具有处理错误的控制器的项目:Security/HandleErrorsController.csprotectedoverride//登录EventViewer的方法if(filterContext.ExceptionHandled)return;filterContext.HttpContext.Response.StatusCode=(int)System.Net.HttpStatusCode.InternalServerError;filterContext.Result=newJsonResult{Data=new{Success=false,Error="Pleasereporttoadmin.",ErrorText=filterContext.Exception.Message,Stack=filterContext.Exception.StackTrace},JsonRequestBehavior=JsonRequestBehavior.AllowGet};filterContext.ExceptionHandled=true;像这样的所有问题都不是很有建设性,因为答案总是“视情况而定”,因为有很多方法可以处理错误。许多人更喜欢使用HandleError方法,因为任何异常基本上都是不可恢复的。我的意思是,如果你不能归还物品,你打算怎么办?无论如何你都会向他们展示一个错误,对吧?问题变成了,你想如何向他们展示错误。如果可以接受显示错误页面,则HandleError可以正常工作并提供一个简单的地方来记录错误。如果您正在使用Ajax或想要更高级的东西,那么您需要开发一种方法来执行此操作。您谈论的是DataProvider类。这基本上是您的存储库。为什么不将它构建到您的存储库中?以上就是《C#学习教程:Controller(ASP.NETMVC)中的异常处理》分享的全部内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: