在Ruby koans,第6次练习中,有:
def test_you_dont_get_null_pointer_errors_when_calling_methods_on_nil
# What happens when you call a method that doesn't exist.
# The following begin/rescue/end code block captures the exception and
# make some assertions about it.
begin
nil.some_method_nil_doesnt_know_about
rescue Exception => ex
# What exception has been caught?
assert_equal __, ex.class
# What message was attached to the exception?
# (HINT: replace __ with part of the error message.)
assert_match(/__/, ex.message)
end
end
我不知道那里有=>
个符号?我不清楚begin
和rescue
。
答案 0 :(得分:1)
当你想停止代码执行时,因为有错误,你会“引发异常”。
“捕获异常”允许继续执行代码,这就是这个koan似乎的意义所在。你想看看NilClass异常发生后会发生什么。
您可以在Ruby手册here中阅读有关捕获异常的特殊表单。
答案 1 :(得分:1)
当出现问题时,您可以“提出异常”
def do_it
# ..
raise Exception.new("something went wrong !") if something_went_wrong
end
如果something_went_wrong为true,这将停止执行程序。 如果你不处理异常。
要处理异常,请使用“rescue Exception”
begin
do_it
rescue Exception
puts "Something went wrong, but go on anyway"
end
如果您需要处理异常,可以使用“=>”为其指定名称
begin
do_it
rescue Exception => ex
# Now "ex" is the name of the Exception. And "ex.inspect" inspects it.
puts "Something went wrong, #{ex.inspect}, .."
end
如果你喜欢ruby koans,你可能也喜欢rubymonk在线教程。在“Ruby Primer:Ascent”中是关于异常的课程。
答案 2 :(得分:1)
ovhaag几乎涵盖了这个问题,但让我在问题的begin
方面添加更多信息。
当您使用成对begin/end
关键字时,您实际上正在创建一个围绕您可能想要处理的错误的显式包装器。这是一个例子:
def opening_file
print "File to open:"
filename = gets.chomp
fh = File.open(filename)
yield fh
fh.close
rescue
puts "Couldn't open your file"
end
假设在这个示例代码中可能会出现许多不同的错误,例如:文件名格式错误,由于某种原因文件不存在。代码中出现任何错误,它将立即返回到rescue
子句,在这种情况下是输出消息。
这种方法的问题在于输出消息非常通用,它可以应用于许多可能不合适的不同错误,eg: if the error was that the format of the filename is wrong, "Couldn't open your file" is not very helpful. on the other hand, a message "The format is wrong" is much more suitable.
现在,如果您想精确查明无法打开文件的情况,请使用开始/结束对。
def opening_file
print "File to open:"
filename = gets.chomp
begin
fh = File.open(filename)
rescue
puts "Couldn't open your file because it doesn't exists"
return
end
yield fh
fh.close
end
这样,只有当您尝试打开文件时出现错误才会退回到救援条款中。
关于=>
的最后一点注释,通过将异常对象分配给您可以调用backtrace
和message
方法的变量,可以帮助您查看代码的去向错。