Versuch und Rettung dienen verschiedenen Zwecken. Der Zweck von try
ist es, Sie davor zu bewahren, Folgendes tun zu müssen:
if user && user.email
Oder jede Situation, in der das übergeordnete Objekt möglicherweise Null sein kann, was einen NoMethodError in NilClass verursachen würde. Der Zweck von rescue
besteht darin, Ausnahmen zu behandeln, die durch Ihren Methodenaufruf ausgelöst werden. Wenn Sie erwarten, dass eine Ausnahme aufgerufen wird user.email
, können Sie dies rescue nil
tun, um zu verhindern, dass die Ausnahme in die Luft sprudelt.
Im Allgemeinen würde ich sagen, vermeiden Sie die Verwendung, es rescue nil
sei denn, Sie wissen explizit, welche Ausnahmen Sie retten, weil Sie möglicherweise eine andere Ausnahme retten, und Sie würden es nie erfahren, weil Sie es nicht sehen könnten rescue nil
. Zumindest könnten Sie es vielleicht protokollieren:
begin
...some code...
rescue => ex
logger.error ex.message
end
ActiveSuppot#try
.Beide scheinen faul zu sein und können andere Käfer maskieren. Bist du sicher, dass du wirklich nichts erreichen willst? Vielleicht ist es besser, zuerst zu überprüfen, ob es Kommentare gibt, und den leeren Fall explizit abzudecken?
quelle
Nichts ist etwas ist ein ausgezeichneter Vortrag von Sandi Metz, der hilft zu verstehen, warum @AdamByrtek genau richtig ist und warum wir alle die fehlgeschlagenen Fälle intelligenter und objektorientierter markieren sollten
x ? y : nil
quelle