В чем разница - техническая, философская, концептуальная или иная - между
raise "foo"
и
raise Exception.new("foo")
?
В чем разница - техническая, философская, концептуальная или иная - между
raise "foo"
и
raise Exception.new("foo")
?
Технически первый вызывает RuntimeError с сообщением, установленным на "foo", а второй вызывает исключение с сообщением, установленным на "foo".
Практически существует существенная разница между тем, когда вы хотите использовать первое и когда хотите использовать последний.
Проще говоря, вы, вероятно, хотите RuntimeError не a Exception. Блок спасения без аргумента поймает RuntimeErrors, но НЕ поймает Exception s. Поэтому, если вы поднимите Exception в свой код, этот код не поймает его:
begin
rescue
end
Чтобы поймать Exception, вам нужно будет сделать это:
begin
rescue Exception
end
Это означает, что в некотором смысле Exception является "худшей" ошибкой, чем a RuntimeError, потому что вам нужно сделать больше работы, чтобы восстановить ее.
Так что вы хотите, зависит от того, как ваш проект выполняет свою обработку ошибок. Например, у наших демонов основной цикл имеет пустое спасение, которое поймает RuntimeErrors, сообщит об этом, а затем продолжит. Но в одном или двух обстоятельствах мы хотим, чтобы демон действительно действительно умирал от ошибки, и в этом случае мы поднимаем Exception, который проходит прямо через наш "нормальный код обработки ошибок" и выходит.
И снова, если вы пишете библиотечный код, вы, вероятно, захотите RuntimeError, а не Exception, так как пользователи вашей библиотеки будут удивлены, если он вызывает ошибки, которые пустой блок rescue не может поймать, и им потребуется время, чтобы понять, почему.
Наконец, я должен сказать, что RuntimeError является подклассом класса StandardError, и фактическое правило состоит в том, что, хотя вы можете raise любой тип объекта, пустой rescue будет по умолчанию только улавливать все, что наследуется от StandardError. Все остальное должно быть конкретным.
raise
raise( string )
raise( exception [, string [, array ] ] )
Без аргументов возникает исключение в $! или возникает a RuntimeError, если $! равно nil. С единственным аргументом String он вызывает RuntimeError со строкой в качестве сообщения. В противном случае первым параметром должно быть имя класса Exception (или объект, который возвращает Exception при отправленном исключении). Второй необязательный параметр устанавливает сообщение, связанное с исключением, а третий параметр представляет собой массив информации обратного вызова. Исключения захватываются предложением rescue блоков begin...end.
raise "Failed to create socket"
raise ArgumentError, "No parameters", caller