Próbuję doskonalić swoje umiejętności w Rubim, łapiąc wyjątki. Chcę wiedzieć, czy często ponownie generuje się ten sam rodzaj wyjątku, gdy masz kilka wywołań metod. Czy więc następujący kod miałby sens? Czy można ponownie wywołać wyjątek tego samego rodzaju, czy też nie powinienem go przechwytywać w metodzie procesu?
class Logo
def process
begin
@processed_logo = LogoProcessor::create_image(self.src)
rescue CustomException
raise CustomException
end
end
end
module LogoProcessor
def self.create_image
raise CustomException if some_condition
end
end
begin @logo.process; rescue...
ale wtedy nie łapałbym wyjątku uruchamianego przez sam proces, ale czegoś, co zostało wywołane z wewnątrz procesu. Czy to prawda?stacktrace
oryginalnego wyjątku, prawdopodobnie chcesz dołączyć wyjątek,cause
który jest dostępny w ruby> 2.1raise
w sposób podany w tej odpowiedzi całkowicie zachowuje oryginalny wyjątek, w tym rozszerzeniebacktrace
.cause
nie dotyczy tego przypadku. Raczej jest wypełniany automatycznie, gdyrescue
blok zgłosi nowy wyjątek.$!
zmiennej globalnej. Wywołanieraise
bez argumentów podnosi błąd zawarty w$!
, skutecznie podnosząc ostatni błąd. Jednakraise error
spowoduje zgłoszenie błędu zawartego werror
zmiennej lokalnej, która może, ale nie musi być tym samym obiektem zawartym w$!
. W moim przykładzie$!
jest taki sam jakerror
. Jednak jest to również możliwe:error = Exception.new; raise error
Spowoduje to zgłoszenie tego samego rodzaju błędu co oryginał, ale możesz dostosować komunikat.
rescue StandardError => e raise e.class, "Message: #{e.message}"
źródło