5 Stimmen

Verwendung einer einzeiligen bedingten Anweisung mit require/rescue

Ich möchte einen Fehler vermeiden, wenn ein require nicht erfolgreich ist.

Ich kann das mit folgendem Code erreichen:

begin
  require 'nicht_vorhandenes_skript' 
rescue LoadError
end

Ich habe versucht, dasselbe mit einer Einzeiligen Bedingung zu machen:

require 'nicht_vorhandenes_skript' rescue LoadError

und erhalte den Fehler Datei nicht gefunden -- nicht_vorhandenes_skript (LoadError)

Bei anderen Ausnahmen/Befehlen habe ich kein Problem mit einem Einzeiligen rescue, das funktioniert:

1 / 0 rescue ZeroDivisionError

Ich habe auch versucht, den Befehl in Klammern zu setzen, jedoch ohne Erfolg:

(require 'nicht_vorhandenes_skript') rescue LoadError

Ich kann alles in einer Zeile mit ; setzen:

begin require 'nicht_vorhandenes_skript'; rescue LoadError; end

aber ich frage mich immer noch, warum die kürzeste Version nicht funktioniert.

Ich habe einige verwandte Fragen gefunden, aber keine davon erwähnt ein Problem mit require und rescue:

Meine Frage:

Kann ich rescue in einer Einzeiligen Bedingung mit require verwenden? Wenn ja: wie? Wenn nein: Warum nicht?

10voto

sawa Punkte 160498

Sie können die Fehlerklasse nicht festlegen, wenn Sie rescue in der Postfix/Oneliner-Notation verwenden. Was rescue LoadError oder rescue ZeroDivisionError bedeutet, ist, dass es ein (Unterklasse von) StandardError auffangen wird und in diesem Fall LoadError oder ZeroDivisionError ausgewertet wird, was keine Auswirkung hat. Da ZeroDivisionError eine Unterklasse von StandardError ist, wurde sie erfasst, aber LoadError nicht, und wurde nicht erfasst.

Übrigens, mir fällt kein Anwendungsfall ein, in dem Sie keinen Fehler auslösen möchten, wenn eine erforderliche Datei nicht vorhanden ist. Erforderliche Dateien sind Abhängigkeiten, und wenn das Erfordern fehlschlägt, wird das Programm sowieso nicht korrekt funktionieren. Ich sehe einen unangenehmen Code in dem, was Sie tun. Wenn das Scheitern des Ladens einer Datei das Programm nicht durcheinander bringt, ist das normalerweise der Fall, wenn Sie load anstelle von require verwenden sollten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X