Exceptions mit raise und fail

In Ruby gibt es eine Menge Methoden-Aliase und Synonyme, die exakt das Gleiche machen. Das ist kein Zufall oder Willkür.
Das ist ein beabsichtigtes Konzept, um expressiven Code schreiben zu können.
Genauso verhält es sich mit Kernel#raise und dem Zwilling Kernel#fail.
Die meisten Ruby-Entwickler verwenden Kernel#raise, um Exceptions zu auszulösen. Aber nur Wenige verwenden Kernel#fail um das Gleiche in einem anderen Kontext zu erreichen. Sie verpassen die Chance, die Ausdrucksstärke ihres Codes zu erhöhen.
Jim Weirich war wohl der Erste, der Kernel#raise und Kernel#fail für verschiedene Zwecke verwendete.
Dieses Muster anzuwenden ist eine stilistische Entscheidung und entspricht dem Ruby Styleguide.

Fail exception

Verwende Kernel#fail zum Auslösen von Exceptions, wenn Code in seinem wahren Sinne fehl schlägt (das heißt, ein unerwartetes Verhalten, dass die Abarbeitung unterbricht):

class Account
  def register(name)
    fail ArgumentError, "The assigned parameter is not a name." unless name.is_a? String
    "Hello #{name}!"
  end
end

Raise exception

Verwende Kernel#raise zum Auslösen von Exceptions, wenn die Exception hinterher wieder gefangen wird, wie zum Beispiel in der Ruby on Rails Implementierung:

module ActiveRecord
  class Persistence
    def save!(*)
      create_or_update || raise(RecordNotSaved.new("Failed to save the record", self))
    end
  end
end

Die Intention ist, Kernel#raise zu verwenden, wenn der Code nicht fehlschlägt, aber explizit eine Ausnahme auslöst. In der Praxis ist das genannte Szenario selten der Fall. Daher ist Kernel#fail der ständige Begleiter des Rubyisten.
Apropos Ausnahme:
Exceptions sollten nicht für die Flusskontrolle verwendet werden!
Dann ist throw / catch das Mittel der Wahl.