2013-05-19 1 views
1

В Рубиновые Коаны, 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 мне непонятно.

+1

Вы знаете об Исключениях вообще? (Java, Python и т. Д.)? – Dogbert

+0

Код имеет неприятный запах, чтобы его улучшить, вы можете просто удалить начало/конец из тела метода, но оставить блок спасения. – taro

ответ

1

Когда что-то пойдет не так, вы можете «поднять» Exception

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

Это остановит выполнение программы, если something_went_wrong верно. И если вы не обрабатываете исключение.

Для обработки исключений вы используете «спасение 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» есть Урок об исключениях.

1

Если вы хотите остановить выполнение кода, потому что есть ошибка, вы «поднимите Исключение».

«Ловля исключения» позволяет продолжить выполнение кода, и это то, о чем, по-видимому, говорит этот коан. Вы хотите узнать, что происходит после возникновения исключения NilClass.

Вы можете прочитать об особой форме для исключения исключений в руководствах Ruby here.

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.

Теперь, если вы хотите, чтобы точно определить сценарий, где файл не может быть открыт, вы используете пару 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 

Таким образом, только если ошибка в то время, при попытке открыть файл будет падать обратно в пункте спасения.

Последнее примечание относительно =>, путем присвоения объекта исключения переменной у вас есть возможность вызова backtrace и message метод, который может помочь вам увидеть, где код пошло не так.

Смежные вопросы