Возбуждение исключения: использовать экземпляр или класс? - PullRequest
6 голосов
/ 09 марта 2012

Я видел код Ruby, который вызывает исключения, используя класс:

raise GoatException,    "Maximum of 3 goats per bumper car."

Другой код использует экземпляр:

raise GoatException.new "No leotard found suitable for goat."

Оба они спасены одинаково. Есть ли причина использовать экземпляр против класса?

1 Ответ

11 голосов
/ 09 марта 2012

без разницы; класс исключения будет вызываться в любом случае.

Если вы предоставите строку в качестве аргумента для new или в качестве второго аргумента для raise, она будет передана в initialize и станет экземпляром исключения .message.

Например:

class GoatException < StandardError
  def initialize(message)
    puts "initializing with message: #{message}"
    super
  end
end

begin
  raise GoatException.new "Goats do not enjoy origami." #--|
                                                        #  | Equivilents
  raise GoatException,    "Goats do not enjoy origami." #--|
rescue Exception => e
  puts "Goat exception! The class is '#{e.class}'. Message is '#{e.message}'"
end

Если вы прокомментируете первый raise выше, вы увидите, что:

  • В обоих случаях вызывается initialize.
  • В обоих случаях классом исключения является GoatException, а не class, как было бы, если бы мы спасали сам класс исключения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...