fail关键字在Ruby中有什么作用?


88

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

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

8
除了下面的答案,值得一提的是,人们raise在处理异常和fail不处理异常时都会使用它们。
Bala 2013年

6
这不是关键字,而是方法。
约尔格W¯¯米塔格


另请注意,您可以将这些语句写为单行语句:fail "Password too short" if password.length < 8fail "No user name set" unless username
PhilT

Answers:


136

在Ruby中,fail是的同义词raise。该fail关键字是所述的方法Kernel,其是由类包括模块Object。该fail方法会引发运行时错误,就像raise关键字一样。

fail方法具有三个重载:

  • fail:引发RuntimeError没有错误信息的。

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

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

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

    fail ArgumentError, "Illegal String"
    

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

    fail ArgumentError, "Illegal String", caller
    

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

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

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


2
您能否给出3个简单的例子以及3个要点?这将使您的答案更加具体.. :)
Arup Rakshit

1

它为我工作,但它Rubocop转换为raise
保罗

32

Rubocop谈到两个词的用法。

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

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

这是一个例子。

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

+1进行风格咨询;即使他们在语义上完全相同,在预期的设置中使用每个
变量也

26

fail == raise

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

fail ArgumentError, "Don't argue with me!"

7

www.ruby-doc.org是您的朋友。当我在Google上搜索rubydoc fail内核”时,它是第一个热门。我的建议是,如果有疑问,请转到权威来源,以获取诸如此类的定义性内容。


2
哇,那真的是失败。失败的代码示例是从抬起o_O复制粘贴
Vajk Hermecz 2014年

4
@VajkHermecz失败是抬高的别名,因此它重复使用了文档。与Array#map和Array#collect的文档进行比较
Jamie Macey 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.