如何开始,救援和=>符号工作?

时间:2013-05-19 13:16:51

标签: ruby

在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

我不知道那里有=>个符号?我不清楚beginrescue

3 个答案:

答案 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

这样,只有当您尝试打开文件时出现错误才会退回到救援条款中。

关于=>的最后一点注释,通过将异常对象分配给您可以调用backtracemessage方法的变量,可以帮助您查看代码的去向错。