Asp.net mvc 实体框架中的异常处理,带存储库模式的MVC

Asp.net mvc 实体框架中的异常处理,带存储库模式的MVC,asp.net-mvc,entity-framework,exception,repository-pattern,unit-of-work,Asp.net Mvc,Entity Framework,Exception,Repository Pattern,Unit Of Work,我将实体框架用于我的项目,MVC作为前端,我已经用存储库模式实现了工作单元模式 我在存储库的顶部有一个服务层来处理业务 我的问题是在哪里处理异常? 将所有异常传递到表示层并在控制器中处理是一个好主意,还是我需要在底层处理它?好吧,一般的想法是不让UI处理所有异常,这也没有多大意义。假设您有一个使用ADO.NET实现的数据层。这里的一般模式是在数据层中处理SqlException,然后将SqlException包装在更具意义的DatabaseLayerException中,这是上层应该处理的概念-

我将实体框架用于我的项目,MVC作为前端,我已经用存储库模式实现了工作单元模式

我在存储库的顶部有一个服务层来处理业务

我的问题是在哪里处理异常?


将所有异常传递到表示层并在控制器中处理是一个好主意,还是我需要在底层处理它?

好吧,一般的想法是不让UI处理所有异常,这也没有多大意义。假设您有一个使用ADO.NET实现的数据层。这里的一般模式是在数据层中处理SqlException,然后将SqlException包装在更具意义的DatabaseLayerException中,这是上层应该处理的概念-您一直遵循此模式,因此您可以拥有InfrastructureException、ApplicationException等功能

在最上面,您捕获所有未处理的ApplicationException(并使所有异常继承此多态性),然后捕获所有未处理的异常,作为不太可能发生的特殊情况,并尝试从中恢复


我还建议使用日志记录,可以是手动的,也可以是AOP——你会在网上找到大量的资源(可能是Log4Net?)

我认为在任何异常处理策略中,你都有以下选择:

  • 若可能,要从异常中恢复(例如,实例服务器已关闭,请稍等片刻,然后重试)
  • 忽略异常,因为它不够严重或其他任何原因
  • 把它往上吹。这里有多种策略,比如一个
    抛出
    抛出新异常(“消息”,InnerException)来列举一些
最后,还有一些全局选项,用于将异常记录到某些日志格式,或发送电子邮件等。我不将其包括在上述三个选项中,因为这是所有上述三个选项的全局选项

话虽如此,我认为在上面描述的应用程序的每一层中,您都必须问自己,在上述三种方式中,您可以用哪种方式处理异常。如果您不能从中恢复或忽略它,那么您应该将它向上冒泡到一个友好的错误页面,在那里您可以对异常进行最终清理和显示