Ruby-Ausnahme
Ausnahmen und Ausführung sind immer verbunden. Wenn Sie eine Datei öffnen, die nicht vorhanden ist, und nicht richtig mit der Situation umgehen, dann wird Ihr Programm als von geringer Qualität sein.
Wenn eine Ausnahme auftritt, stoppt das Programm. Ausnahmebehandlung für alle Arten von Fehlern, die während der Programmausführung auftreten können, so geeignete Maßnahmen zu ergreifen, und wird nicht zulassen, das Programm vollständig gestoppt.
Rubin bietet einen perfekten Mechanismus Ausnahmen für die Handhabung. Wir können Code anhängen , die eine Ausnahme auslösen könnte, undRettungsKlauseln verwenden Rubin die perfekte Art von Ausnahme zu sagen , in derBeginn / Ende- Block behandelt werden.
Grammatik
begin #开始 raise.. #抛出异常 rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException $! #表示异常信息 $@ #表示异常出现的代码位置 else #其余异常 .. ensure #不管有没有异常,进入该代码块 end #结束
Zunächst einmalalles von derRettunggeschützt ist. Wenn bei der Ausführung des Codeblocks Ausnahme auftritt, wird die Steuerung zwischen demEndeund derBlockrettungübergebenwerden.
FürbeginnenBlock jederescue- Klausel, Ruby und die wiederum geworfen Ausnahme jeden Parameter Vergleich. Wenn die Rettungsklausel Benennung Ausnahme und Ausnahme-Typ durch den gleichen Strom geworfen, oder ist die Elternklasse der Ausnahme, war das Spiel erfolgreich.
Wenn die Ausnahme nicht jede der angegebenen Fehlertyp entsprechen, können wir eineelse- Klausel , nachdem alleRettungs- Klausel verwenden.
Beispiele
#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" end rescue file = STDIN end print file, "==", STDIN, "\n"
Beispiele für die obige Ausgabe ausgeführt wird. Wie Siesehen können,ersetzen STDIN dieDateiaus,weil dieoffenegescheitert.
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
VerwendenWiederholungsAussage
Sie können dieRettungsblockverwenden , um die Ausnahme zu fangen, und dann dasWiederholungsanweisungsblockverwenden beginnen von Anfang anbeginnen.
Grammatik
begin # 这段代码抛出的异常将被下面的 rescue 子句捕获 rescue # 这个块将捕获所有类型的异常 retry # 这将把控制移到 begin 的开头 end
Beispiele
#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" end rescue fname = "existant_file" retry end
Im Folgenden ist der Prozessablauf:
- Eine Ausnahme ist aufgetreten, wenn sie geöffnet.
- Weiter zu retten. fname neu zugewiesen werden.
- Direkt zu Beginn zunächst erneut versuchen können.
- Die Datei wird erfolgreich geöffnet.
- Fortsetzung der grundlegenden Prozess.
Hinweis: Wenn die umbenannte Datei nicht existiert, diese unendlich viele Versuche Kräfte Code.So ist die Ausnahmebehandlung, seien Sie vorsichtig ,erneut versuchenkönnen.
Verwendenraise- Anweisung
Sie können dieraise- Anweisung verwenden , um eine Ausnahme auslöst. Die folgende Methode löst eine Ausnahme aus, wenn Sie anrufen. Die zweite Nachricht wird ausgegeben.
Grammatik
raise 或 raise "Error Message" 或 raise ExceptionType, "Error Message" 或 raise ExceptionType, "Error Message" condition
Die erste Form einfach die aktuelle Ausnahme erneut werfen (wenn es keine aktuelle Ausnahme ist ein Runtime geworfen). Dies wird verwendet, bevor die eingehenden Ausnahme Ausnahme Exception-Handler zu erklären.
Die zweite Form schafft eine neueRuntimeAusnahme, seine Nachricht an die angegebene Zeichenfolge zu setzen. Nach dem Aufruf-Stack die Ausnahme zu werfen.
Eine dritte Form des ersten Parameters eine Ausnahme, dann stellen Sie die zugehörigen Nachrichten als zweiten Parameter zu erstellen.
Die vierte Form und die dritte Form ist ähnlich, können Sie weitere bedingte Anweisungen ( zum Beispiel ,es sei denn)fügen Sie eine Ausnahme zu werfen.
Beispiele
#!/usr/bin/ruby begin puts 'I am before the raise.' raise 'An error has occurred.' puts 'I am after the raise.' rescue puts 'I am rescued.' end puts 'I am after the begin block.'
Führen Sie das obige Beispiel Ausgabe lautet:
I am before the raise. I am rescued. I am after the begin block.
Weitere Anwendungsbeispiele DemonstrationErhöhung:
#!/usr/bin/ruby begin raise 'A test exception.' rescue Exception => e puts e.message puts e.backtrace.inspect end
Führen Sie das obige Beispiel Ausgabe lautet:
A test exception. ["main.rb:4"]
Sicherstellen,dassdie Verwendung von Aussagen
Manchmal, unabhängig davon, ob eine Ausnahme ausgelöst wird, müssen Sie sicherstellen, dass einige Verfahren am Ende des Codeblocks abgeschlossen ist. Zum Beispiel könnten Sie eine Datei zum Zeitpunkt der Eintragung zu öffnen, wenn Sie den Block zu verlassen, müssen Sie sicherstellen, dass die Datei zu schließen.
gewährleistenKlausel , dies zu tun ist. sicherzustellen, nach dem letzten rescue-Klausel platziert und enthält ein Blockbeendigungscode Block immer ausgeführt. Es ist normal , um den Block zu verlassen, werfen und behandeln Ausnahmen ob, ob wegen eine abgefangene Ausnahme beendet wird , keine dieserBeziehungen,gewährleisten Block immer ausgeführt wird .
Grammatik
begin #.. 过程 #.. 抛出异常 rescue #.. 处理错误 ensure #.. 最后确保执行 #.. 这总是会执行 end
Beispiele
begin raise 'A test exception.' rescue Exception => e puts e.message puts e.backtrace.inspect ensure puts "Ensuring execution" end
Führen Sie das obige Beispiel Ausgabe lautet:
A test exception. ["main.rb:4"] Ensuring execution
MitanderenAussagen
Wenn dieelse- Klausel vorgesehen ist, wird es in der Regel nach derRettungKlausel platziert, bevor einegewährleisten.
Körperelse- Klausel wird nur , wenn der Körper des Codes ausgeführt , ohne eine Ausnahme auszulösen.
Grammatik
begin #.. 过程 #.. 抛出异常 rescue #.. 处理错误 else #.. 如果没有异常则执行 ensure #.. 最后确保执行 #.. 这总是会执行 end
Beispiele
begin # 抛出 'A test exception.' puts "I'm not raising exception" rescue Exception => e puts e.message puts e.backtrace.inspect else puts "Congratulations-- no errors!" ensure puts "Ensuring execution" end
Führen Sie das obige Beispiel Ausgabe lautet:
I'm not raising exception Congratulations-- no errors! Ensuring execution
Verwenden $! Variable kann die Fehlermeldung geworfen fangen.
Fangen und Werfen
erhöhen und Rettungsausnahmemechanismus kann bis Ausführung geben, wenn ein Fehler auftritt, müssen Sie manchmal in den normalen Prozess der einige tief verschachtelten Struktur springen. An diesem Punkt fangen und in praktisch werfen kommen.
Fangdefiniert einen bestimmten Namensschild als ein Block (kann ein Symbol oder String sein). Block wird in der Regel trifft auf einen Wurf ausgeführt wissen.
Grammatik
throw :lablename #.. 这不会被执行 catch :lablename do #.. 在遇到一个 throw 后匹配将被执行的 catch end 或 throw :lablename condition #.. 这不会被执行 catch :lablename do #.. 在遇到一个 throw 后匹配将被执行的 catch end
Beispiele
Das folgende Beispiel, wenn ein Benutzer '!' Auf jede Aufforderung reagieren, verwenden Sie einen Wurf Interaktion mit dem Benutzer zu beenden.
def promptAndGet(prompt) print prompt res = readline.chomp throw :quitRequested if res == "!" return res end catch :quitRequested do name = promptAndGet("Name: ") age = promptAndGet("Age: ") sex = promptAndGet("Sex: ") # .. # 处理信息 end promptAndGet("Name:")
Das obige Programm erfordert menschliche Interaktion, können Sie auf Ihrem Computer versuchen. Führen Sie das obige Beispiel Ausgabe lautet:
Name: Ruby on Rails Age: 3 Sex: ! Name:Just Ruby
Ausnahmeklasse
Rubys Standardklassen und Module geworfen. Alle Ausnahmeklassen bilden eine Hierarchie, einschließlich der Oberseite der inneren Ausnahmeklasse. Die nächste Schicht ist sieben verschiedene Typen:
- Interrupt
- NoMemoryError
- SignalException
- ScriptError
- Standarderror
- Systemexit
Fatal ist die Schicht eines anderen Ausnahme, aber der Ruby-Interpreter es nur intern verwenden.
ScriptError und Standarderror haben einige Unterkategorien, aber hier müssen wir diese Details zu kennen. Das Wichtigste ist unsere eigene Exception-Klasse zu erstellen, müssen sie eine Unterklasse der Klasse Exception oder seine Nachkommen sein.
Lassen Sie uns ein Beispiel an:
class FileSaveError < StandardError attr_reader :reason def initialize(reason) @reason = reason end end
Nun, schauen Sie sich das folgende Beispiel wird in den oben genannten Ausnahmen verwendet werden:
File.open(path, "w") do |file| begin # 写出数据 ... rescue # 发生错误 raise FileSaveError.new($!) end end
Hier ist die wichtigste Linie ist FileSaveError.newerhöhen($!). Wir nennen erhöhen schematisch Ausnahme aufgetreten ist, es passiert eine neue Instanz FileSaveError aufgrund spezifischer durch Daten verursacht Anomalien Schreiben schlägt fehl.