89

我正在学习 Ruby 并遇到了fail关键字。这是什么意思?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
4

4 回答 4

141

在 Ruby 中,failraise. fail关键字是Kernel类包含的模块的方法Object。该fail方法会引发运行时错误,就像raise关键字一样。

fail方法具有三个重载:

  • fail: 引发 aRuntimeError没有错误消息。

  • fail(string): 使用字符串参数引发 aRuntimeError作为错误消息:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): 引发类异常exception(第一个参数),带有可选的错误消息(第二个参数)和回调信息(第三个参数)。

    示例:假设您定义了一个函数,如果给定一个错误的参数,该函数应该会失败。最好提出 aArgumentError而不是 a RuntimeError

    fail ArgumentError, "Illegal String"
    

    另一个示例:您可以将整个回溯传递给该fail方法,以便您可以访问rescue块内的跟踪:

    fail ArgumentError, "Illegal String", caller
    

    caller是一个内核方法,它以形式返回回溯作为字符串数组file:line: in 'method'

没有参数,在 $! 中引发异常 或引发 RuntimeError 如果 $! 是零。使用单个 String 参数,引发带有字符串作为消息的 RuntimeError。否则,第一个参数应该是异常类的名称(或在发送异常消息时返回异常对象的对象)。可选的第二个参数设置与异常关联的消息,第三个参数是回调信息数组。异常被 begin...end 块的救援子句捕获。

来源:内核模块上的 Ruby 文档

于 2013-09-15T11:20:44.003 回答
33

Rubocop谈到了这两个词的用法;

“使用fail而不是raise表示异常。”

“使用raise而不是fail重新抛出异常。”

这是一个例子。

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
于 2015-11-11T12:33:42.573 回答
26

fail==raise

换句话说,fail只是raise错误引发方法的流行别名。用法:

fail ArgumentError, "Don't argue with me!"
于 2013-09-15T11:17:52.137 回答
7

www.ruby-doc.org是您的朋友。当我用谷歌搜索rubydoc fail内核”是第一个命中。我的建议是,当有疑问时,去寻找像这样的定义性东西的权威来源。

于 2013-09-15T15:28:17.303 回答