让用户决定函数是否返回异常或 null

问题描述 投票:0回答:1

我正在构建一个 SDK,它提供一些 GET 功能,例如:

GetCustomerByIdGetProductById

在某些用例中,如果未找到 id,这些函数应返回 null,而在其他用例中,应抛出异常,因为这将是意外行为。

我的想法是以某种方式设计我的获取函数,以便我的 SDK 的用户可以自己决定函数的行为方式。

我的想法是:

  • 每个函数都有一个可选参数“throwExceptionIfNotFound”。如果这是真的,我的函数将抛出我的 SDK 公开的异常:即。 MySDKNotFoundException。
  • 每个功能分为两个功能:
    GetCustomerById and GetCustomerByIdOrThrow
    。 Throw-Function 将抛出 SDK 公开的异常,就像第一种方法一样。
  • 每个函数被分成两个具有相同名称和参数的函数,但其中一个函数获得一个通用参数,该参数定义了如果找不到 id 则应抛出的异常:
    GetCustomerById and GetCustomerById<ExceptionToThrow>

最后一种方法是我最喜欢的。我的 SDK 的用户甚至可以灵活地定义自己的异常,该异常应该在未找到时抛出。

您觉得我的三个想法怎么样?还有其他想法吗?为什么要使用其中一种而不是另一种?

c# exception architecture software-design
1个回答
0
投票

我认为这三个都可以,但就我个人而言,我不会选择第三个,因为它限制了您可以对异常执行的操作(例如提供用户定义的错误消息,尽管可以使用它来解决)

Func<TException>
工厂)。

我个人会采用两种方法,但还有另外两种值得考虑的变化:

  1. “尝试”模式如

    int.TryParse
    ,看起来像:

    bool TryGetCustomerById(IdType id, out Customer customer)
    
  2. 我发现另一种方法很有用,但可以说它比 SDK 更适合“内部”使用 - 对于不同的情况使用不同的动词,例如

    Find
    用于非抛出版本(它与 可空引用类型很好地配对,所以返回类型是
    Customer?
    ) 和
    Get
    用于抛出一个。所以签名可以是这样的:

    Customer GetCustomerById(IdType id); // throws
    Customer? FindCustomerById(IdType id) // does not throw
    

但这需要客户了解约定。

© www.soinside.com 2019 - 2024. All rights reserved.