File.open не делает ничего волшебного, по сути, это просто File.new с блоком, завернутым в begin / sure, который автоматически закроет файл для вас в конце блока, независимо от того, нормально ли он закончился,или если внутри него произошло какое-то исключение.
Таким образом, вы должны обрабатывать исключения в случае File.open, как и в любых других частях вашего кода ruby.Вы можете позволить этому скользить и позволить исключениям быть обработанными в другом месте (другими обработчиками в цепочке обработчиков исключений), или вы можете быть строгими и обрабатывать их на месте.Это решение не имеет ничего общего с File.open, оно больше связано с характером вашего кода / приложения и целевой аудиторией.Например, если вы пишете сценарий, который будет запускаться только вами, то, вероятно, можно позволить исключению скользить и завершать работу сценария с трассировкой стека, в других случаях вы, вероятно, захотите быть более «профессиональным» и работать с ним.это изящно, и в этом случае вам придется использовать begin / rescue в какой-то момент.
Вот код, который, мы надеемся, демистифицирует File.open (в основном это просто реализация RAII идиома в рубине)
File.open("foo") {|f|
# do something with the opened file
f.read
# once the block has finished, the file will be closed automatically
}
# File.open is essentially:
f = File.new "foo"
begin
yield f
ensure
f.close
end
# So in any case if you'd like to handle any exception that might be raised, just do the usual thing:
begin
File.open("foo") {|f|
# do something with the opened file
f.read
}
rescue
# handle all the exceptions - either coming from open/new or from inner file-handling block
end
begin
f = File.new "foo"
begin
# do something with the opened file
f.read
ensure
f.close
end
rescue
# handle the exceptions, using multiple rescue if needed to catch exact exception types like Errno::EACCES, etc
end