7 Stimmen

Ruby - Ausführung abgelaufen

Ich habe einen Ruby-Code wie diesen:

begin
  doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
  log.error "Fehler: #{ex}"
end

Und ich bekomme ein Log wie dieses:

ERROR -- : Fehler: Ausführung abgelaufen

Ich möchte, dass der Block so lange neu ausgeführt wird, bis er erfolgreich ist.

Wie kann ich das tun?

24voto

mu is too short Punkte 411765

Ich werde etwas weiter auf meinen Kommentar eingehen. Sie können retry verwenden, um zum begin zurückzukehren:

begin
  doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
  log.error "Fehler: #{ex}"
  retry
end

Das wird weiterhin versuchen (und Fehler protokollieren), bis es funktioniert oder Sie es manuell beenden. Das ist wahrscheinlich nicht das, was Sie wollen, da Sie bei einem kleinen Fehler in einer Endlosschleife landen können. Ein einfacher Weg, dies zu umgehen, besteht darin, es beispielsweise 10 Mal versuchen zu lassen und dann aufzugeben:

MAX_ATTEMPTS = 10

doc = nil
begin
  doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
  log.error "Fehler: #{ex}"
  attempts = attempts + 1
  retry if(attempts < MAX_ATTEMPTS)
end

if(doc.nil?)
  # Unternehmen Sie etwas gegen den persistenten Fehler
  # damit Sie später nicht versuchen, auf ein nil zuzugreifen.
end

Etwas Ähnliches wird einige Male versuchen und dann aufgeben. Sie könnten auch einen sleep-Aufruf vor dem retry einfügen, wenn Sie etwas Zeit vergehen lassen möchten, bevor der nächste Versuch unternommen wird. Oder Sie könnten die Exception untersuchen (möglicherweise mit mehreren rescue-Blöcken), um zu entscheiden, ob Sie sofort aufgeben, warten und erneut versuchen oder sofort wiederholen 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