Exception handling 如何避免“上的异常驱动编程”;“连接/断开”;方法

Exception handling 如何避免“上的异常驱动编程”;“连接/断开”;方法,exception-handling,Exception Handling,我知道异常驱动编程是不应该做的事情(我想这是为什么)。 我正在构建一个库,在那里我必须建立与设备的连接,因此程序员将调用MyDeviceInstance.Connect,在某个点上,现在就是我的问题出现的地方 我将connect方法编写为void connect(),因此我不返回任何内容(因为实际上我不需要任何内容),但在很多情况下我都会抛出异常: 如果连接已经存在 如果MyDeviceInstance中存在一些错误设置 如果我的interop方法deviceConnect失败(这是最大的问题,

我知道异常驱动编程是不应该做的事情(我想这是为什么)。 我正在构建一个库,在那里我必须建立与设备的连接,因此程序员将调用MyDeviceInstance.Connect,在某个点上,现在就是我的问题出现的地方

我将connect方法编写为void connect(),因此我不返回任何内容(因为实际上我不需要任何内容),但在很多情况下我都会抛出异常:

  • 如果连接已经存在
  • 如果MyDeviceInstance中存在一些错误设置
  • 如果我的interop方法deviceConnect失败(这是最大的问题,因为它将返回一个int,表示大量错误)
  • Connect是否应该返回布尔值而不是void?有很多可能我会抛出异常

    这个问题的第二部分是关于另一个方法,称为void Update()。仅当MyDeviceInstance已连接时,此方法才能工作。在本例中,我将在以下情况下抛出异常:

  • 连接不存在
  • 连接因任何原因丢失(程序员不会期望这种情况发生,但可以)
  • 其他互操作错误
  • 更新是否应该返回bool值,而不是抛出所有这些异常(至少是为了限制常见错误,如“连接不存在”)

    谢谢你的回答

    编辑1:

    我必须更准确地指出一点:因为我们讨论的是一个USB设备,当我调用我的方法更新时,该方法可能会失败,具体取决于设备(是否连接)。更重要的是,如果我重新连接设备,interop方法将重新开始工作(正常方法也会这样做),而不需要重新连接或类似的事情(我不知道这在内部是如何工作的)


    对于更新方法,如果设备断开连接,是否应该抛出?从编程的角度来说,这是一个例外,但从用户的角度来说,这将是一个非常正常的情况。

    在异常情况下使用例外。那么你怎么知道你有一个特殊的情况呢?当然,这取决于上下文,并没有硬性规定。请注意,异常非常重要,您不应该在应用程序的正常流中使用它们

    在你提到的例子中,大多数似乎都有例外

    对于
    连接
    ,已经存在的连接可能不是例外情况。如果愿意,可以将其设为幂等。互操作
    deviceConnect
    失败无疑是一种例外情况。一些你没有预料到的事情。您可以在此处引发异常,可能会将退出代码映射到有意义的异常

    对于
    更新
    ,连接不存在可能是异常情况,您可以引发异常。此外,连接丢失也是例外。这样你就可以评估你的处境


    此外,您还可以查看返回的int实际上是错误,而不是布尔值。

    在异常情况下使用异常。那么你怎么知道你有一个特殊的情况呢?当然,这取决于上下文,并没有硬性规定。请注意,异常非常重要,您不应该在应用程序的正常流中使用它们

    在你提到的例子中,大多数似乎都有例外

    对于
    连接
    ,已经存在的连接可能不是例外情况。如果愿意,可以将其设为幂等。互操作
    deviceConnect
    失败无疑是一种例外情况。一些你没有预料到的事情。您可以在此处引发异常,可能会将退出代码映射到有意义的异常

    对于
    更新
    ,连接不存在可能是异常情况,您可以引发异常。此外,连接丢失也是例外。这样你就可以评估你的处境


    此外,您还可以查看返回的int实际上是错误,而不是布尔值。

    如果您的连接/更新方法可能失败,则无论如何返回一个bool表示失败/成功。您还可以向类中添加错误代码和/或错误消息方法/属性,程序员可以在需要时访问这些方法/属性

    如果您的连接/更新方法可能失败,那么请务必返回失败/成功的bool。您还可以向类中添加错误代码和/或错误消息方法/属性,程序员可以在需要时访问这些方法/属性

    在这种情况下使用异常是完全正确的

  • 异常表明发生了异常情况。通常,您希望连接成功,因此连接失败表示发生异常事件

  • 异常可以提供有关调用失败原因的丰富信息

  • 你不能忽视一个例外(你必须慎重考虑)。当请求的操作表示无效请求时,调用方法很容易忽略它并继续滥用连接。异常强制调用方处理该问题


  • 反对使用异常的主要论点通常围绕性能。如果对所有错误传递都使用异常,这可能是一个问题。但是,当您正在执行的操作通常应该成功时,异常不会对性能产生任何影响。

    在这种情况下,异常正是正确的选择

  • 异常表明发生了异常情况。通常,您希望连接成功,因此连接失败表示发生异常事件

  • 异常可以提供有关调用失败原因的丰富信息

  • 你不能忽视一个例外(你必须慎重考虑)。 ResultType DoSomething(); Boolean TryDoSomething(ref ResultType result); ResultType TryDoSomething(ref Boolean ok); ResultType TryDoSomething(ref Exception ex); ResultType TryDoSomething(Action failureAction);