c# - 在 Onion 架构中抛出异常 vs 返回操作结果对象

标签 c# error-handling architecture onion-architecture

我有一个由 Onion Architecture 实现的项目,它类似于 Ordering .我需要处理所有层中的验证错误。据我所知,通常有以下两种方法来处理错误:

1- 抛出异常

2- 返回操作结果

In your view, which one is the best?



1- 抛出异常

这是我的方法。正如您在 ValidatorBehavior 中看到的那样, 我用过 ValidatorBehavior处理与验证我的命令相关的验证错误,例如 this . FluentValidation用于验证输入命令,错误缓存在 Handle ValidatorBehavior 中的方法.

问题之一是FluentValidation如果命令无效则抛出异常。此异常可以缓存在 HttpGlobalExceptionFilter 中在 Web API 中。

有人说异常是针对意外情况,但是在这个场景(Validation)中,我们知道验证阶段的结果,我们通过抛出异常来实现一些业务规则。

另一个是在 Domain Layer 中使用抛出异常喜欢 StatusChangeException .所以毫无疑问,我们需要在其他层抛出异常。

2- 返回操作结果

在我的一些 friend 建议的第二种方法中,我们可以使用 handle errors 通过名为 OperationResult 的对象将这些错误显示给最终用户。 .从性能的角度来看,它似乎更好,因为抛出异常比第一种方法更昂贵。

您如何看待这两种方法?我想知道您是否分享了做出最佳决定的想法。

最佳答案

对于异常错误,我通常从所有层中抛出异常,这些异常在全局异常处理程序中处理。这允许我的应用程序和域代码保持“干净”,我的意思是,它可以专注于正常流程而不是处理异常。毕竟,异常是异常(exception)的,不是正常流程的一部分,所以对我来说,它们不应该破坏你的“正常”逻辑。

至于你的性能评论,我认为这并不重要,因为你在这里谈论的是微优化,所以基本上,这不是一个真正的问题。

关于c# - 在 Onion 架构中抛出异常 vs 返回操作结果对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943702/

相关文章:

web-services - 模块化架构 "multiplatform"

c# - 如何在 C# MVC3 中使用 MPXJ .net 读取 .mpp 文件?

c# - 如何从 C# 查询 GetMonitorBrightness

c# - 使用 Task.WaitAll() 来处理等待的任务?

angular - 使用 Angular ErrorHandler 并映射错误结果

Python IndexError 被抛出,即使它在两个 except block 内

vba - Excel VBA-错误处理和字符串搜索

c# - 将匿名数组添加到属性中。不可能?

Mysql日志表架构

c# - 架构问题 : Fluent NHibernate, 存储库模式和 ASP.NET MVC