Latest web development tutorials

eccezione rubino

Eccezioni e l'esecuzione sono sempre legati. Se si apre un file che non esiste, e non gestire correttamente la situazione, allora il programma è considerato di bassa qualità.

Se si verifica un'eccezione, il programma si ferma. La gestione delle eccezioni per tutti i tipi di errori che possono verificarsi durante l'esecuzione del programma, in modo da prendere i provvedimenti opportuni, e non lasciare che il programma completamente fermo.

Rubino fornisce un meccanismo perfetto per la gestione delle eccezioni. Siamo in grado di collegare il codice che potrebbe generare un'eccezione, e utilizzare le clausoledi salvataggioper dire rubino il tipo perfetto d'eccezione da gestire nel blocco diinizio / fine.

grammatica

begin #开始
 
 raise.. #抛出异常
 
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
 $! #表示异常信息
 $@ #表示异常出现的代码位置
else #其余异常
 ..
ensure #不管有没有异常,进入该代码块
 
end #结束

Periniziaretutto dalsalvataggioè protetto. Se durante verifica l'esecuzione del blocco di codice eccezione, verrà passato controllo tra lafinee ilsalvataggio blocco.

Periniziareblocco ogni clausolarescue,Ruby e l'eccezione generata a sua volta per ciascun confronto parametro. Se il tipo di eccezione denominazione clausola di salvataggio e eccezione generata dalla stessa corrente, o è la classe genitrice di eccezione, la partita ha avuto successo.

Se l'eccezione non corrisponde a nessuno del tipo di errore specificato, possiamo utilizzare una clausolaelse,dopo tutto clausolarescue.

Esempi

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
      file = STDIN
end
print file, "==", STDIN, "\n"

Esempi di uscita sopra è in esecuzione. Come si puòvedere,STDIN sostituire ilfile,perchél'aperturanon è riuscita.

#<IO:0xb7d16f84>==#<IO:0xb7d16f84>

dichiarazione Usaretry

È possibile utilizzare il bloccodi salvataggioper intercettare l'eccezione, e quindi utilizzare il blocco di istruzionitentativiinizianocominciaredall'inizio.

grammatica

begin
    # 这段代码抛出的异常将被下面的 rescue 子句捕获
rescue
    # 这个块将捕获所有类型的异常
    retry  # 这将把控制移到 begin 的开头
end

Esempi

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
   fname = "existant_file"
   retry
end

Quanto segue è il flusso del processo:

  • Si è verificata un'eccezione quando aperto.
  • Vai a salvare. fname essere riassegnati.
  • Saltare all'inizio cominciare dal tentativo.
  • Il file viene aperto con successo.
  • Continuare il processo di base.

Nota: se il file rinominato non esiste, questo codice forze tentativi illimitate.Così la gestione delle eccezioni, fare attenzionetentativi.

dichiarazione Usaraise

È possibile utilizzare l'istruzioneraisegenera un'eccezione. Il seguente metodo genera un'eccezione quando si chiama. Il suo secondo messaggio viene emesso.

grammatica

raise 

或

raise "Error Message" 

或

raise ExceptionType, "Error Message"

或

raise ExceptionType, "Error Message" condition

La prima forma semplicemente ri-lanciare l'eccezione corrente (se non vi è alcuna eccezione corrente viene generata una RuntimeError). Questo è usato per spiegare prima il gestore di eccezioni eccezioni eccezioni in entrata.

La seconda forma crea una nuova eccezioneRuntimeError,impostando il suo messaggio alla stringa data. Dopo la chiamata stack per generare l'eccezione.

Una terza forma del primo parametro per creare un'eccezione, quindi impostare i messaggi correlati come il secondo parametro.

La quarta forma e la terza forma è simile, è possibile aggiungere qualsiasi istruzioni condizionali aggiuntive (ad esempioa meno)per generare un'eccezione.

Esempi

#!/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.'  

Eseguire l'uscita precedente esempio è il seguente:

I am before the raise.  
I am rescued.  
I am after the begin block.  

Un altroraisedimostrazione esempi di utilizzo:

#!/usr/bin/ruby

begin  
  raise 'A test exception.'  
rescue Exception => e  
  puts e.message  
  puts e.backtrace.inspect  
end  

Eseguire l'uscita precedente esempio è il seguente:

A test exception.
["main.rb:4"]

Garantirel'uso di dichiarazioni

A volte, indipendentemente dal fatto che viene generata un'eccezione, è necessario assicurarsi che un processo è completato alla fine del blocco di codice. Ad esempio, è possibile aprire un file, al momento dell'ingresso, quando si esce dal blocco, è necessario assicurarsi di chiudere il file.

garantireclausola di fare è questo. garantire posizionato dopo l'ultima clausola di salvataggio e contiene un blocco di codice di terminazione blocco viene sempre eseguito. E 'normale per uscire dal blocco, lanciare e gestire le eccezioni se, sia a causa di un'eccezione non rilevata termina, nessuno di questirapporti,assicurano blocco funzionerà sempre.

grammatica

begin 
   #.. 过程
   #.. 抛出异常
rescue 
   #.. 处理错误 
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

Esempi

begin
  raise 'A test exception.'
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
ensure
  puts "Ensuring execution"
end

Eseguire l'uscita precedente esempio è il seguente:

A test exception.
["main.rb:4"]
Ensuring execution

Utilizzandoelse

Se viene fornita la clausolaaltro,di solito è posizionato dopo la clausola disalvataggio,prima diassicurare un qualsiasi.

altrocorpo clausola viene eseguito solo quando il corpo di codice senza un'eccezione.

grammatica

begin 
   #.. 过程 
   #.. 抛出异常
rescue 
   #.. 处理错误
else
   #.. 如果没有异常则执行
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

Esempi

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

Eseguire l'uscita precedente esempio è il seguente:

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

Usa $! Variabile può prendere il messaggio di errore gettato.

Cattura e Getta

aumentare e il meccanismo di eccezione di soccorso può rinunciare esecuzione quando si verifica un errore, a volte è necessario per saltare nel normale processo di qualche struttura nidificazione. A questo punto cattura e gettare tornare utile.

catturadefinisce un dato nome (può essere un simbolo o String) etichetta come un blocco. Blocco viene eseguito normalmente sa incontri un tiro.

grammatica

throw :lablename
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

或

throw :lablename condition
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

Esempi

Il seguente esempio, se un utente digita '!' Rispondere a qualsiasi richiesta, utilizzare un tiro di interrompere l'interazione con l'utente.

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:")

Il programma di cui sopra richiede l'interazione umana, si può provare sul vostro computer. Eseguire l'uscita precedente esempio è il seguente:

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

classe di eccezione

classi standard e moduli di Ruby gettati. Tutte le classi di eccezioni formano una gerarchia, tra cui il primo della classe eccezione interna. Il livello successivo è sette tipi diversi:

  • Interruzione
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

Fatal è lo strato di un'altra eccezione, ma l'interprete di Ruby utilizzare solo internamente.

ScriptError e StandardError hanno alcune sotto-categorie, ma qui abbiamo bisogno di conoscere questi dettagli. La cosa più importante è quello di creare la nostra classe di eccezione, devono essere una sottoclasse di Exception classe o la sua progenie.

Diamo un'occhiata a un esempio:

class FileSaveError < StandardError
   attr_reader :reason
   def initialize(reason)
      @reason = reason
   end
end

Ora, guardate il seguente esempio saranno utilizzati nelle eccezioni di cui sopra:

File.open(path, "w") do |file|
begin
    # 写出数据 ...
rescue
    # 发生错误
    raise FileSaveError.new($!)
end
end

Qui, la linea più importante èalzareFileSaveError.new ($!). Chiamiamo ad aumentare in modo schematico è verificata un'eccezione, passò una nuova istanza FileSaveError a causa di anomalie specifiche causati da dati non riesce scrittura.