【问题标题】:Which methods should throw exceptions and which ones should return a boolean value哪些方法应该抛出异常,哪些应该返回布尔值
【发布时间】:2017-12-11 00:16:51
【问题描述】:

我不了解有关方法何时应引发异常或返回错误代码/boolean 结果的最佳实践。

具体来说,我有这种情况:有一个线程每 30 秒轮询一次设备(检索其状态)。

如果设备不可访问,应用程序不能停止,因为它不需要能够与提到的设备通信来执行它所做的所有其他操作。

所以,一般来说,线程代码如下:

while(true)
{
  device.connect();
  string st = device.getStatus();
  updateStatus(st);
  device.disconnect();
  sleep(30);
}

目前,如果设备不在线,connect() 方法会抛出异常。

我认为,在这种情况下,让connect() 方法返回布尔结果以报告设备是否可访问也许是一种更好的做法,但我完全不确定。

上面是这样的:

while(true)
{
  if(device.connect())
  {
    string st = device.getStatus();
    device.disconnect();
    updateStatus(st);
  }
  sleep(30);
}

实际上,当应用程序投入生产时,设备“应该”始终在线,这让我认为最好的选择是例外。

另一方面,应用程序可以在不与设备通信的情况下完美地保持执行。它未连接的唯一后果是与之关联的功能被禁用。这就是让我觉得boolean 返回值更好的原因。

如果设备未连接,我将有一个线程每 30 秒抛出一次异常。 即使捕获到异常,这在软件工程良好实践方面是否可以接受?

【问题讨论】:

标签: design-patterns error-handling exception-handling software-design


【解决方案1】:

根据原始问题评论中链接的线程,异常确实使您能够提供有关实际失败的更多详细信息。在这种情况下,布尔值可能是限制性的——如果设备没有连接,或者它连接了什么但没有响应怎么办?异常可以清楚地表明这两种情况,而布尔值则不能。

在我看来,布尔值在应用程序具有两种可能的结果且仍可“正常”运行(例如验证)时运行良好。例如,如果您的应用需要验证电子邮件地址,而用户输入了无效的电子邮件地址,那没关系 - 应用可以正常运行,并提示用户修复验证错误。

但是,如果某些事情干扰了应用程序的正常执行,例如设备无法访问,我会例外。毕竟,这是一种特殊情况。对于它的价值,如果我用 Java 这样的语言编写代码,我会使用检查异常since it's something that the application can reasonably be expected to recover from

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2016-02-15
    • 2019-03-17
    相关资源
    最近更新 更多