如何决定一个函数是返回错误还是产生异常? [复制]

Posted

技术标签:

【中文标题】如何决定一个函数是返回错误还是产生异常? [复制]【英文标题】:How to decide if a function should return an error or generate an exception? [duplicate] 【发布时间】:2013-04-16 20:50:48 【问题描述】:

库和 API 有时会返回 -1 或 null 以指示错误。

在其他情况下,它们会生成异常。

如果我必须编写自己的函数,我应该在什么时候使用返回值来指示错误以及什么时候出现异常?

【问题讨论】:

如果您不了解异常(这是常态),请避免使用它们。太容易用错了。 知道如何使用异常非常重要,我不建议任何人避免它们,而是学习 【参考方案1】:

如果你使用String.indexOf(...),你会看到它返回-1,但这不是错误。在查询数据库时也是如此,如果找不到所需的内容,则返回 null。

但是对于真正的错误,真正的问题,最好抛出一个异常。

【讨论】:

【参考方案2】:

通常当某个方法返回一个值时,这是因为它是一个被其他人调用的内部方法并在用户可以访问它们时生成异常,您可以处理此异常而不向用户显示错误。

【讨论】:

【参考方案3】:

编辑:我在不知不觉中冒险进入 java-land.. 这个答案的代码是 c#.. 对此感到抱歉

异常是昂贵的(它们会使你的程序变慢),所以它们应该只用于非常特殊的情况。我的做法是,大多数时候,我只在我的私人函数中返回 -1,因为它们不需要像其他函数那样严格的文档。如果错误经常出现,使用bool TrySomething(in, out result) 格式的函数也是一个很好的约定。

那么客户端就可以了

if(TrySomething(in, out result))
    handle(result);
else
    //failed Something

如果这不切实际,那么通常异常会更安全,因为它们不会给您任何静默错误(除非您使用空的 catch 块处理异常)。

【讨论】:

【参考方案4】:

如果它真的是一个错误(由于一些内部意外错误或因为参数违反了某些约束,函数未能完成它应该做的事情)那么你应该抛出一个异常 - 这就是异常的用途。

您可以返回 null 或 -1 来表示“在给定字符串中查找子字符串的位置”,以表示“未找到”。但这不是错误,这是正确且预期的(“非异常”)行为。

【讨论】:

【参考方案5】:

异常向开发人员(有时是您自己,通常是其他人)传达特定方法或函数所说的:

我无法处理这个问题,这是别人的责任。

例如,如果你的方法正在解析一个字符串并返回一个 int,如果它传递了一个像 "xyzzy" 这样的字符串,它是否应该返回 -1?

不,-1 会返回错误的错误值,因为“-1”是代表合法 int 的合法字符串。

在这种情况下,您希望解析方法抛出异常。调用方法必须处理解析异常。您(和未来的)开发人员会明白,处理解析错误是调用者的责任。

编辑:在这种特殊情况下,您可以让函数返回整数而不是 int。然后,您可能有一个合同,它对 Integer 有效但对 int 无效,表示某种错误。但由于 null 是单个值,您的调用程序将无法区分字符串是不可解析的(“xyzzy”)还是太大而无法表示(“2147483648”)。

【讨论】:

以上是关于如何决定一个函数是返回错误还是产生异常? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

lua中怎么捕获错误异常信息

当任何数学运算产生“NaN”时,如何强制 C# 编译器抛出异常?

.NET 5 在引发自定义异常时将内容复制到流时产生错误

php的异常处理

C++笔记--异常

中断异常trap 的区别