1

在 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

4

3 回答 3

1

当出现问题时,您可以“引发异常”

def do_it
  # ..
  raise Exception.new("something went wrong !") if something_went_wrong
end

如果 something_went_wrong 为真,这将停止程序的执行。如果你不处理异常。

要处理异常,请使用“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,你可能也喜欢 ruby ​​monk在线教程。在“Ruby Primer: Ascent”中是关于异常的一课。

于 2013-05-19T17:39:21.103 回答
1

当您想停止代码执行时,因为出现错误,您“引发异常”。

“捕捉异常”允许继续执行代码,这就是这个 koan 似乎是关于的。你想看看 NilClass 异常发生后会发生什么。

您可以在此处阅读 Ruby 手册中关于捕获异常的特殊形式。

于 2013-05-19T15:06:52.227 回答
1

ovhaag 几乎涵盖了这个问题,但让我在begin问题的一边添加更多信息。

当您使用 pairbegin/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

这样,只有在您尝试打开文件时出现错误时才会退回到您的救援子句中。

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

于 2013-05-19T18:13:11.900 回答