Why can't I catch the test exception in the “caller” method?
我不明白为什么这段代码不能正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13
| def test
raise Exception.new 'error'
end
def caller
begin
test
rescue =>e
puts e.message
end
end
caller |
我想在caller方法中捕获测试异常,但似乎caller方法没有捕获任何东西。
-
fwiw,在方法中执行begin rescue end时,可以删除begin和end。 保存几行代码,即def caller;test;rescue Exception=>e;puts e.message;end
-
就像风格一样,在引发异常时不需要使用new。 raise Exception, 'error'就足够了。
您的代码不起作用的原因是因为没有明确声明的异常类型的rescue只捕获StandardError,它是exception的子类。 由于你正在提高exception,它高于StandardError,你的rescue不能捕获它。
通常,您希望使用更具体的异常,并且几乎不需要在StandardError上使用exception。
例如,这可以正常工作:
1 2 3 4 5 6 7
| begin
raise StandardError.new 'Uh-oh!'
rescue => e
p e.message
end
#=> Uh-oh! |
-
"通常你想要使用更具体的例外",同意。 添加的粒度有助于在"战斗条件"中处理流量控制。
您应该指定rescue所需的异常类型。 尝试
-
谢谢这个运作良好。 我无法理解throw和raise语句之间的区别......
-
不一定......看我的答案。 rescue Exception => e通常是一个坏主意,因为您可能正在捕获比应用程序准备好处理的更低级别的异常。
-
@BenD,这个问题涉及抛出/提高差异。
-
我同意coreyward:更好的建议不是首先提出Exception而是使用更具体的错误类,如StandardError
简打败了我,但......
将=> var语法与exception一起使用时,必须指定要拯救的异常类型。 所有异常的基类都是Exception,因此如果将其更改为rescue Exception => e,它将起作用。 此外,当您从中获取的是整个方法时,您不需要显式的开始...结束块......
1 2 3 4 5 6 7 8 9 10 11
| def test
raise Exception.new 'error'
end
def caller
test
rescue Exception =>e
puts e.message
end
caller() |
-
同样,这不一定是真的。 您可能不希望rescue Exception => e,因为您要捕获的低级异常超出了程序能够处理的范围。
-
当然,我应该提到拯救Exception通常不是一件好事。 因为,在这种情况下,Exception正在被提出,但是......