使用错误的函数参数验证是Go中的一个好模式吗?

时间:2014-04-04 13:01:18

标签: validation go

使用错误返回码进行参数验证是否被视为良好做法?我的意思是有人应该在哪里使用错误与恐慌(有没有指导方针?)。

例如:

  • 检查非nil +如果没有问题则返回错误 练习?
  • 或检查正确的整数范围等。

我认为使用通常会让Go觉得非常C-ish并且看起来非常糟糕的错误。在这些情况下,恐慌是不是一个好的选择?

或者Gopher应该使用Python / Ruby / JS方法“只是让它失败”?

我有点困惑,因为在我的理解中恐慌是真正的“错误”。但是一直使用错误只是

即使我会返回错误代码:如果某人将错误的参数传递给我的函数但忽略错误代码,我该怎么办? - >没有!老实说,我会说恐慌对于那些情况很好,但是在一种语言中,错误代码用于恐慌,这不是很清楚。

2 个答案:

答案 0 :(得分:14)

"逃逸" Go中的panic s 1 (我的意思是那些可能由包含公共API的函数生成的那些)是处理程序员所做的错误。因此,如果你的函数获得一个指向一个对象的指针,并且它不能是nil(比如说​​,表明该值丢失了),那么继续并取消引用指针以使运行时{{1}如果恰好是panic,它本身。如果某个函数需要一个必须在某个范围内的整数,nil如果它不在该范围内 - 因为在正确的程序中,所有值都可能传递给您函数 在该范围内,如果他们不在,那么程序员就不能遵守API,或者他们没有消除从外部获得的值,这也不是你的错。

另一方面,无法打开文件或pefrorm等问题,如果正确调用 这个函数应该返回一个适当的错误。

请注意,在.NET和Java代码中公共API函数中显式检查panic参数的建议有不同的目标,即使这类错误更具可读性。但是,由于99%的.NET和Java代码只是让所有异常传播到顶层(然后显示或可能被记录),它只是将一个(由运行时生成)异常替换为另一个异常。它可能会使错误更加明显 - 在API函数中执行失败,而不是在调用堆栈的更深处 - 但会给这些API函数增加不必要的瑕疵。所以,是的,这是固执己见的,但我的主观意见是:让它只是崩溃在Go-you中你会得到一个描述性的堆栈跟踪。

TL; DR

关于运行时问题的处理,

  • panic用于编程错误;
  • 返回错误是指执行预期的功能任务时遇到的问题。

1 null的另一个合法用途是快速"冷路径"从深度递归处理/计算返回;在这种情况下,panic应由您的包捕获并处理,相应的公共API函数应返回错误。有关详细信息,请参阅thisthis

答案 1 :(得分:1)

答案是主观的。以下是我的想法:

关于恐慌,我喜欢Go By Example(ref

中的引用
  恐慌通常意味着出乎意料的错误。大多数情况下,我们使用它来快速应对在正常操作期间不应发生的错误,或者我们不准备优雅地处理错误。

在您的用例说明中,我认为您应该提出错误并处理错误。我进一步争辩说,当您使用的功能提供错误状态并且用户应检查文档中是否提供了错误状态时,最好检查错误状态。

恐慌我会用来停止执行,如果我遇到从你正在编写的函数返回的错误,我检查并且没有办法从中恢复。