库和 API 有时会返回 -1 或 null 以指示错误。
在其他情况下,它们会产生异常。
如果我必须编写自己的函数,我应该在什么时候使用返回值来指示错误以及什么时候出现异常?
如果使用String.indexOf(...)
,您将看到它返回 -1,但这不是错误。在查询数据库时也是如此,如果找不到所需的内容,则返回 null。
但是对于真正的错误,真正的问题,最好抛出异常。
如果它真的是一个错误(由于一些内部意外错误或因为参数违反了某些约束,函数未能完成它应该做的事情)那么你应该抛出一个异常 - 这就是异常的用途。
例如,您可以返回null
或 -1 来表示“在给定字符串中查找子字符串的位置”以表示“未找到”。但这不是错误,这是正确和预期的(“非异常”)行为。
通常,当某个方法返回一个值时,这是因为是由另一个方法调用的内部方法并在用户可以访问它们时生成异常,您可以处理此异常而不向用户显示错误。
编辑:我在不知不觉中冒险进入 java-land.. 这个答案的代码是 c#.. 对此感到抱歉
异常是昂贵的(它们会使你的程序变慢),所以它们应该只用于非常特殊的情况。我的做法是,大多数时候,我只在我的私人函数中返回 -1,因为它们不需要像其他函数那样严格的文档。如果错误经常出现,使用该格式的函数bool TrySomething(in, out result)
也是一个很好的约定。
然后客户端可以做
if(TrySomething(in, out result))
handle(result);
else
//failed Something
如果这不切实际,那么通常异常会更安全,因为它们不会给您任何静默错误(除非您使用空catch
块处理异常)。
异常会向开发人员(有时是您自己,通常是其他人)传达特定方法或函数所说的:
我无法处理这个问题,这是别人的责任。
例如,如果您的方法正在解析一个字符串并返回一个 int,如果它传递了一个像“xyzzy”这样的字符串,它是否应该返回 -1?
不,-1 会返回错误的错误值,因为“-1”是代表合法 int 的合法字符串。
这是您希望解析方法抛出异常的情况。调用方法必须处理解析异常。您(和未来的)开发人员会明白,处理解析错误是调用者的责任。
编辑:在这种特殊情况下,您可以让函数返回整数而不是 int。然后,您可能有一个合同,它对 Integer 有效但对 int 无效,表示某种错误。但是因为 null 是单个值,所以您的调用程序将无法区分字符串是不可解析的(“xyzzy”)还是太大而无法表示(“2147483648”)。