让用户知道对函数的非法输入

时间:2012-07-17 20:09:16

标签: java c++ error-handling

这是一个广泛的问题,但无论如何我想问。希望我不会得到很多投票:)

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

我个人说使用断言或者可能会返回一个特殊号码让用户知道,但我不确定他是否对这些答案感到满意。

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

6 个答案:

答案 0 :(得分:5)

我听说你们有例外吗?

C ++的方式是抛出一个异常,如果出现问题,这将迫使代码的用户明确地做某事 - 否则他/她的应用程序将终止。

这也是关于错误处理的广泛建议 1 ,关于使用例外的性能影响的争论已经开始逐渐淡化为计算机能力增加和编译器变得更聪明。

有些人声称使用异常会破坏代码的可读性,这会使其难以遵循并难以维护,并且可能存在一些事实。

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


C ++异常的最大问题(从我的观点来看)是缺少finally - 子句,如果可以使用一个,然后在异常后编写负责清理的代码被抓住将是一个更简单的任务。


推荐阅读:


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


整个项目的一致性......

如果你找到一个好的方法让你的代码的调用者知道出错了(可能是通过 return-value ,通过引用设置的错误标志或异常,或几乎......任何事情)只要确保在整个项目中使用相同的错误通知系统

没有什么比在错误处理方面使用不稳定的lib更令人烦恼。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:2)

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

请参阅:Advantages of Exceptions - 优势#2:在调用堆栈中传播错误类似于“如何让用户知道”的问题 - 用户启动了调用,因此最终异常一路回来。

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

  

已检查的例外:代表区外的无效条件   立即控制程序( 无效的用户输入 ,da tabase问题,网络中断,缺少文件)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

如果您想通知最终用户他对您的应用程序输入错误,那么您应该显示一个对话框,说明情况就是这样。

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