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

そこにどんな=>記号があるのか​​わからない?beginそしてrescue私には明らかではありません。

4

3 に答える 3

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」には、例外に関するレッスンがあります。

于 2013-05-19T17:39:21.103 に答える
1

エラーが発生したため、コードの実行を停止したい場合は、「例外を発生させます」。

「例外をキャッチする」ことにより、コードの実行を継続できます。これが、この公案の目的のようです。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.

ファイルを開くことができなかったシナリオを正確に特定したい場合は、begin/end ペアを使用します。

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

この方法では、ファイルを開こうとしたときにエラーが発生した場合にのみ、rescue 句にフォールバックします。

に関する最後の注意点として、例外オブジェクトを変数に代入することで、 andメソッド=>を呼び出すことができるため、コードのどこが間違っているかを確認するのに役立ちます。backtracemessage

于 2013-05-19T18:13:11.900 に答える