2017-03-29 4 views
1

Ich versuche zu verstehen, wie Fehler zwischen den Klassen in Ruby propagieren. Ich habe dies so weit:Kannst du vor bestimmten Fehlern mit Nachrichten in Ruby retten?

class User 
    def charge 
    puts "charging order soon" 
    raise RuntimeError.new("This is a runtime error") 
    rescue ArgumentError 
    puts "should never gets here" 
    end 
end 

class Runner 
    def run 
    begin 
     User.new.charge 
    rescue RuntimeError => e 
     puts e.message 
    end 
    end 
end 

Runner.new.run 

Als ich dies ausführen, bekomme ich diese das Recht scheint:

$ ruby errors.rb 
charging order soon 
This is a runtime error 

Innenläufer, kann ich von der RuntimeError mit einer bestimmten Nachricht retten? Wenn ich mehrere RuntimeErrors um meine Anwendung ausgelöst habe, gibt es irgendeine Möglichkeit für die Runner's Rescue-Klausel nur für RuntimeErrors mit bestimmten Nachrichten ausgelöst werden?

Antwort

2

https://stackoverflow.com/a/23771227/2981429

Siehe Wenn Sie raise in einem Rettungsblock rufen, die letzte angehobene Ausnahme wieder angehoben wird.

In Ihrem Ausnahmeblock, können Sie die Nachricht überprüfen und entscheiden, re-raisen oder nicht:

begin 
    User.new.charge 
rescue RuntimeError => e 
    case e.message 
    when "This is a runtime error" 
    # put your handler code here 
    else 
    raise # re-raise the last exception 
    end 
end 

Allerdings, wenn es Ihr Ziel nur Rettung Fehler ist, dass Sie sich manuell erhöhen, dann ist es wahrscheinlich einfacher,

class MyError < StandardError; end 

Dann statt raise RuntimeError.new("message") Verwendung raise MyError.new("message"), und sie retten normalerweise: stattdessen eine benutzerdefinierte Fehlerklasse definieren

begin 
    User.new.charge 
rescue MyError => e 
    # handler 
end 

Auf diese Weise müssen Sie sich keine Sorgen machen, dass Ihre Rettungen die eingebauten Ausnahmen stören.

+0

Können Sie erklären, warum die Dokumentation vorschlägt, eine Unterklasse von 'StandardError' zu erstellen und dann bestimmte Ausnahmetypen davon zu erben. Ich verstehe nicht wirklich, warum wir das tun würden: https://ruby-doc.org/core-2.2.0/Exception.html – Jwan622

Verwandte Themen