Поймать исключение из верхнего уровня - PullRequest
2 голосов
/ 14 сентября 2011

Вероятно, это очень простой вопрос, но я не могу найти ответ на него где-либо. Я новичок в Ruby 1.9 и использую его для написания коротких скриптов.

Мой вопрос: как мне обрабатывать исключения на верхнем уровне в файле? Действительно ли необходимо заключать раздел, который может вызвать исключение, в предложение начала / конца?

По сути, я пытаюсь сделать следующее:

File.open( "foo" )
rescue Errno::EACCES => e
    # Handle exception

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Вместо того, чтобы спасать исключение, в этом случае вы можете проверить существование перед открытием файла.

if File.exist?("foo.txt")
  File.open("foo.txt")
else
  abort("file.txt doesn't exist")
end
1 голос
/ 14 сентября 2011

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