625 Stimmen

Begin, Rescue und Ensure in Ruby?

Ich habe vor kurzem angefangen, in Ruby zu programmieren und beschäftige mich gerade mit der Behandlung von Ausnahmen.

Ich habe mich gefragt, ob ensure war das Ruby-Äquivalent zu finally in C#? Sollte ich haben:

file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

oder sollte ich das tun?

#store the file
file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
  file.close
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

Hat ensure in jedem Fall aufgerufen werden, auch wenn keine Ausnahme ausgelöst wird?

2 Stimmen

Beides ist nicht gut. Wenn Sie mit externen Ressourcen arbeiten, sollten Sie in der Regel immer wollen, dass die Ressource "opening" innerhalb der begin Block.

5voto

Chris McCauley Punkte 24741

Ja, ensure wie finally garantiert, dass der Block ausgeführt wird . Dies ist sehr nützlich, um sicherzustellen, dass kritische Ressourcen geschützt sind, z. B. das Schließen eines Dateihandles im Fehlerfall oder die Freigabe eines Mutex.

1 Stimmen

Außer in seinem/ihrem Fall gibt es keine Garantie dafür, dass die Datei geschlossen wird, weil File.open Teil befindet sich NICHT innerhalb des begin-ensure-Blocks. Nur file.close ist, aber das reicht nicht aus.

5voto

Aaron Qian Punkte 4227

Ja, ensure Stellt sicher, dass es jedes Mal ausgeführt wird, so dass Sie nicht die file.close im begin Block.

Übrigens, ein guter Weg, um zu testen, ist zu tun:

begin
  # Raise an error here
  raise "Error!!"
rescue
  #handle the error here
ensure
  p "=========inside ensure block"
end

Sie können testen, ob "=========inside ensure block" ausgedruckt wird, wenn eine Ausnahme auftritt. Dann können Sie die Anweisung, die den Fehler auslöst, auskommentieren und sehen, ob die ensure Anweisung ausgeführt wird, indem man sieht, ob etwas ausgedruckt wird.

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