Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分层应用程序中的异常处理_C#_.net_Exception_Exception Handling - Fatal编程技术网

C# 分层应用程序中的异常处理

C# 分层应用程序中的异常处理,c#,.net,exception,exception-handling,C#,.net,Exception,Exception Handling,如果我有一个分层的应用程序,并且我的数据层可能会遇到一个OptimisticConcurrencyException调用层或较低层应该如何处理这个问题 调用层不知道什么是OptimisticConcurrencyException,所以我应该实现一个自定义异常并捕获OptimisticConcurrencyException并抛出自定义异常吗 如果您能提供一些指导,我们将不胜感激。您需要从调用层的角度来看待这一点。该层已要求数据层执行作业。如果您的数据层可以处理OptimisticConcurr

如果我有一个分层的应用程序,并且我的数据层可能会遇到一个OptimisticConcurrencyException调用层或较低层应该如何处理这个问题

调用层不知道什么是OptimisticConcurrencyException,所以我应该实现一个自定义异常并捕获OptimisticConcurrencyException并抛出自定义异常吗


如果您能提供一些指导,我们将不胜感激。

您需要从调用层的角度来看待这一点。该层已要求数据层执行作业。如果您的数据层可以处理
OptimisticConcurrencyException
,并遵守合同,那么请务必抓住它,然后继续并完成作业


但是,如果这对要求您执行的作业来说是致命的,并且如果调用方不期望它,或者不知道它,那么您可以创建自己的异常类,捕获与调用层无关的异常,然后抛出它。这是调用层可以了解的,并且可以作为使用此函数/API的副作用进行详细记录。

OptimisticConcurrencyException
是属于数据层的异常,因此应该包含在其中。调用层不太可能处理它

我将创建一个更通用的异常,例如
DataSourceException
,它将包含一些上下文,例如哪个函数失败(以及哪些参数失败)以及为什么失败。我还将原始异常包含为内部异常

阅读我关于捕获异常的博客文章:

我还写了一些关于异常处理的其他条目,单击异常标记

更新

我将创建以下项目:


  • Web我的UI是MVVM,我想让我的ViewModel通知用户记录是由另一个用户更新的,并相应地执行一些导航,但是我捕获的异常类型是什么?在该层中,它只能将异常标识为System.exception。在这种情况下,创建一个异常,指示记录已更改。例如,
    EntityChangedByOtherException
    或类似的东西。遵循此处的分离接口模式:减少层之间的耦合。@jgauffin,再次感谢您的回复。您是否建议我实现例如EntityChangedByotheException(它将从System.Exception继承)在将抛出它并在另一个程序集中为其定义接口的程序集/层中,例如,IEntityChangedByoTheException,我的VM将使用它?通过这种方式,您可以轻松更改实现,而不会影响其他代码。例如,您从使用实体库开始,但发现它有多陈旧并切换到nhibernate。