C# 抛出业务异常

C# 抛出业务异常,c#,exception,design-patterns,exception-handling,C#,Exception,Design Patterns,Exception Handling,为了调用支付网关等外部服务,我创建了一个提供者程序集,如:MyCompany.Providers.Braintree,它封装了与服务调用相关的所有逻辑。它的工作原理基本上是通过,它包含在自己的组件中 假设提供者有一个“DoPayment”方法,该方法调用网关上的服务,该服务返回两个状态以及一条正文消息: 代码111->付款成功 代码222->资金不足 代码333->未知收款人 当支付未成功完成时,提供商是否应该抛出“业务”异常,或者服务是否应该返回一个封装网关返回内容的类型 我一直选择在这种

为了调用支付网关等外部服务,我创建了一个提供者程序集,如:MyCompany.Providers.Braintree,它封装了与服务调用相关的所有逻辑。它的工作原理基本上是通过,它包含在自己的组件中

假设提供者有一个“DoPayment”方法,该方法调用网关上的服务,该服务返回两个状态以及一条正文消息:

  • 代码111->付款成功
  • 代码222->资金不足
  • 代码333->未知收款人
当支付未成功完成时,提供商是否应该抛出“业务”异常,或者服务是否应该返回一个封装网关返回内容的类型

我一直选择在这种情况下不抛出异常,因为基本上这不是ab异常情况-网关成功地处理了请求(即使付款未完成,请求也得到了处理)。此过程也是Microsoft的建议:

作为普通执行的一部分,不应使用异常来更改程序流。异常只能用于报告和处理错误情况

马丁·福勒对此事也有自己的看法

异常表示超出了所讨论代码的预期行为范围

但这与输入验证有关


你们是干什么的?

你自己回答了这个问题。这是一个定义业务逻辑,结果是一个定义系统状态,因此,没有异常的原因。但是是否有某种模式定义了一般上下文中异常的使用?是的,Microsoft有指导原则。与您相关的部分是:“不要将异常用于正常或预期的错误,或用于正常的控制流。”是的,我知道,但异常是MS stack特有的,当然必须有一些更广泛的一般规则