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
метод, который может помочь вам увидеть, где код пошло не так.
Вы знаете об Исключениях вообще? (Java, Python и т. Д.)? – Dogbert
Код имеет неприятный запах, чтобы его улучшить, вы можете просто удалить начало/конец из тела метода, но оставить блок спасения. – taro