Latest web development tutorials

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.