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