【问题标题】:Letting a user know about an illegal input to a function让用户知道对函数的非法输入
【发布时间】:2012-07-16 19:46:09
【问题描述】:

这是一个广泛的问题,但我还是想问。希望我不会得到很多反对票:)

今天我参加了一次面试,(和往常一样)他们让我写一个函数来计算一个数的阶乘。之后我们讨论了一些可能导致程序崩溃的问题,并讨论了如何让用户知道何时将负值传递给函数。

我个人说过使用断言或者可能返回一个特殊数字让用户知道,但我不确定他是否对这些答案非常满意。

在您看来,让用户知道传递给函数的非法值或在这种情况下最好的做法是什么?

【问题讨论】:

  • 异常与成功/错误返回值,经典辩论。
  • Imo:永远不要在库的公共部分使用断言。这些是为了捕捉您自己的编程错误,而不是验证输入。此外,由于大多数人使用库的发布版本,他们甚至不会看到断言被抛出。

标签: java c++ error-handling


【解决方案1】:

我听说你有例外?

C++ 的处理方式是抛出异常,如果出现问题,这将强制代码的用户显式执行某些操作 - 否则他/她的应用程序将终止。

这也是关于错误处理的广泛建议1,关于使用异常对性能影响的争论已经开始随着计算机能力的减弱而逐渐淡出增加并且编译器变得更智能。

有些人声称使用异常会破坏代码的可读性,使其难以遵循和维护,这可能有些道理。

在更高级的情况下,抛出异常和清理远非一件容易的事,尽管在负责计算诸如 “简单” 之类的东西作为数字的阶乘的函数中 - 使用异常相当一个简单的任务。


C++ 异常的最大问题(从我的角度来看)是缺少finally-clause,如果可以使用它,那么在捕获异常后编写负责清理的代码将是一个更简单的任务。


推荐阅读:


脚注:
1.当然是主观意见。


整个项目的一致性..

如果您找到一种让代码调用者知道出现问题的好方法(可以通过 返回值、通过引用设置的错误标志或 异常 em>,或者几乎......任何东西)只要确保您在整个项目中使用相同的 error-notification-system

没有什么比使用在错误处理方面反复无常的库更烦人的了。

【讨论】:

  • finally 的缺失被确定性对象破坏所弥补。只需确保需要清理的任何内容都由 RAII 对象管理。
【解决方案2】:

我的第一选择是例外,因为它强制函数的用户处理该错误。如果你返回了一个特殊的值,用户可以忽略它并继续使用特殊的错误值,这将导致错误的结果。

【讨论】:

    【解决方案3】:

    验证您的输入总是一个好主意,这只是一个很好的编码实践。

    让您的用户知道是一个有趣的问题,并且很大程度上取决于您的实施。如果您正在构建一个基于 GUI 的程序,您始终可以在将输入插入您的例程之前对其进行验证。如果输入无效,那么您总是可以在屏幕上显示一个指示器。

    如果您只是提供 API,那么我认为抛出异常可能是最好的方法。我已经看到函数 LIKE factorial 的实现,其中答案作为返回值提供,并且提供了一个单独的输入参数,例如用户提供的 unsigned int * 以便可以提供第二个返回值作为状态,其中返回的整数表示各种错误代码。

    当我编写自己的大部分完整程序时,我非常喜欢在放置真正处理输入的例程之前预先验证来自接口的输入,并在输入为时在 GUI 上提供输出无效!

    【讨论】:

      【解决方案4】:

      我会抛出一个异常 - 更可能是一个检查异常(在 Java 中)。

      请参阅:Advantages of Exceptions - 优势 #2:在调用堆栈上传播错误有点符合“如何让用户知道”的问题 - 用户启动了调用,所以最终返回异常一路向上。

      更具体地说,您需要使用 Checked Exception: 快速搜索一些信息:Checked vs Unchecked Exception

      Checked exceptions : 表示区域之外的无效条件 立即控制程序(无效的用户输入、数据库问题、网络中断、缺少文件)

      与通常表示代码逻辑/实现失败的未检查异常相反

      【讨论】:

      • 我相信评论是指“用户输入”作为键盘用户的输入,不一定是图书馆用户。 java中的两个经典例子是NullPointerException和IllegalArgumentException,这两个都是unchecked。
      • 是的,我认为这是问题中“用户输入”的上下文。
      【解决方案5】:

      这取决于函数是什么,以及它是如何使用的。 你可以有一个特殊的返回值,抛出一个异常,或者根据你的需要设置一个错误标志。我认为重要的是在这方面有一个合理的项目范围的理念,并始终如一地使用它。

      【讨论】:

        【解决方案6】:

        如果您想通知最终用户他对您的应用程序进行了不正确的输入,那么您应该显示一个对话框来说明这种情况。

        但是,如果您在谈论其他人实现您的代码,那么refp's answer 是最好的。

        【讨论】:

          猜你喜欢
          • 2013-04-02
          • 1970-01-01
          • 2010-12-14
          • 2016-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-07
          • 1970-01-01
          相关资源
          最近更新 更多