2011-12-05 18 views
11

Provengo da uno sfondo C# in cui di solito ri-sollevo le eccezioni con l'eccezione originale contenuta nell'eccezione genitore. Un concetto simile è disponibile in Ruby? Come posso rilevare e sollevare un'eccezione mantenendo il contesto dell'eccezione di livello inferiore?ruby ​​- re-raise exception con sub-exception

risposta

14

Date un'occhiata i trucchi del discorso Exceptional Ruby di Avdi Grimm:

class MyError < StandardError 
    attr_reader :original 
    def initialize(msg, original=nil); 
    super(msg); 
    @original = original; 
    end 
end 
# ... 
rescue => error 
    raise MyError.new("Error B", error) 
end 
+0

Non è necessario includere msg come argomento in do super (msg). Se si solleva MyError (errore), 'qualche messaggio' con tali modifiche, 'qualche messaggio' verrà passato come argomento implicito. – daremkd

4

Si può estendere StandardError:

class StandardError 
    attr_accessor :original 
end 

e quando si alza un'eccezione, basta impostare questa proprietà:

def reraise ex, original 
    ex.original = original 
    raise ex 
end 

rescue StandardError => e 
    reraise ArgumentError.new('Message'), e 
end 

Con questo approccio sarete in grado di aumentare il rubino standard rors e imposta l'errore genitore per loro, non solo i tuoi errori personalizzati.

5

Ruby 2.1 ha aggiunto la funzionalità per risolvere questo problema.