Latest web development tutorials

exceção do rubi

Excepções e execução estão sempre ligados. Se você abrir um arquivo que não existe, e não tratar adequadamente a situação, em seguida, seu programa é considerado de baixa qualidade.

Se ocorrer uma exceção, o programa pára. manipulação de exceção para todos os tipos de erros que podem ocorrer durante a execução do programa, de modo a tomar medidas adequadas, e não vai deixar o programa completamente parado.

Ruby fornece um mecanismo perfeito para tratamento de exceções. Podemos anexar o código que pode lançar uma exceção, e usar as cláusulasde resgatepara dizer-Rubi o tipo perfeito de exceção a ser tratado no blococomeçar / fim.

gramática

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

Paracomeçartudo deresgateestá protegida. Se durante a execução do bloco de código de exceção ocorre, o controle será passado entre ofime oresgatedobloco.

Paracomeçarbloco de cada cláusulade resgate,Ruby e a exceção lançada em vez de cada comparação parâmetro. Se o tipo de cláusula de resgate exceção de nomeação e exceção lançada pela mesma corrente, ou é a classe pai da exceção, o jogo foi bem sucedida.

Se a exceção não corresponde a qualquer do tipo de erro especificada, podemos usar uma cláusulaelseafinal cláusula deresgate.

Exemplos

#!/usr/bin/ruby

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

Exemplos de saída acima está em execução. Como você podever,STDIN substituir oarquivo,porque oabertofalhou.

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

Uso Declaração derepetição

Você pode usar o blocode resgatepara capturar a exceção e, em seguida, usar o bloco de declaraçãode repetiçãocomeçam acomeçardesde o início.

gramática

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

Exemplos

#!/usr/bin/ruby

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

O que se segue é o fluxo do processo:

  • Uma exceção ocorreu quando aberto.
  • Ir para o resgatar. fname ser reatribuída.
  • Ir para o início começar por repetição.
  • O arquivo é aberto com êxito.
  • Prosseguir o processo de base.

Nota: Se o arquivo renomeado não existe, este código forças tentativas ilimitadas.Assim, o tratamento de exceções, userepetição cautela.

Uso Declaração deaumento

Você pode usar o comandoraiselança uma exceção. O método a seguir lança uma exceção quando você chamar. Sua segunda mensagem será emitido.

gramática

raise 

或

raise "Error Message" 

或

raise ExceptionType, "Error Message"

或

raise ExceptionType, "Error Message" condition

A primeira forma simplesmente re-lançar a exceção atual (se não houver nenhuma exceção atual é jogado um RuntimeError). Esta é usada para explicar antes do manipulador de exceção exceção exceção de entrada.

A segunda forma cria uma nova exceçãoRuntimeError,definindo sua mensagem para a string dada. Após a chamada pilha para lançar a exceção.

Uma terceira forma de o primeiro parâmetro para criar uma exceção, em seguida, defina as mensagens relacionados como o segundo parâmetro.

A quarta forma ea terceira forma é semelhante, você pode adicionar quaisquer instruções condicionais adicionais (porexemplo, a menos)para lançar uma exceção.

Exemplos

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

Execute o exemplo acima saída é:

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

Outro exemplos de uso de demonstraçãoraise:

#!/usr/bin/ruby

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

Execute o exemplo acima saída é:

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

Certifique-seo uso de instruções

Às vezes, independentemente de se uma exceção é lançada, você precisa garantir que algum processo é concluído no final do bloco de código. Por exemplo, você pode abrir um arquivo no momento da entrada, quando você sair do bloco, você precisa ter certeza de arquivar o processo.

garantir acláusula de fazer é esta. garantir colocado após a última cláusula de resgate e contém um bloco de código rescisão bloco é sempre executado. É normal para sair do bloco, lançar e gerir as excepções se, seja por causa de uma exceção não pega termina, nenhuma destasrelações,garantir bloco sempre será executado.

gramática

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

Exemplos

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

Execute o exemplo acima saída é:

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

Usandoelse

Se a cláusulaelseé fornecido, é normalmente colocado após a cláusulade resgate,antes de qualquerassegurar.

cláusulaelsecorpo é executado somente quando o corpo de código sem lançar uma exceção.

gramática

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

Exemplos

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

Execute o exemplo acima saída é:

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

Use $! Variável pode pegar a mensagem de erro lançada.

Pegar e jogar

levantar e mecanismo de exceção de resgate pode desistir de execução quando ocorre um erro, às vezes você precisa pular no processo normal de alguma estrutura profundamente aninhada. Nesta captura ponto e jogar vir a calhar.

capturadefine um determinado nome (pode ser um símbolo ou String) rótulo como um bloco. Bloco é executado normalmente sabe encontros um lance.

gramática

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

或

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

Exemplos

O exemplo a seguir, se um usuário digita '!' Responder a qualquer solicitação, use um lance para terminar a interação com o usuário.

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

O programa acima requer interação humana, você pode tentar em seu computador. Execute o exemplo acima saída é:

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

classe de exceção

classes e módulos padrão do Ruby lançada. Todas as classes de exceção formam uma hierarquia, incluindo o topo da classe exceção interna. A próxima camada é de sete tipos diferentes:

  • interrupção
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

Fatal é a camada de outra exceção, mas o interpretador Ruby só usá-lo internamente.

ScriptError e StandardError tem algumas sub-categorias, mas aqui é preciso saber esses detalhes. A coisa mais importante é criar nossa própria classe de exceção, devem ser uma subclasse de Exception classe ou sua descendência.

Vejamos um exemplo:

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

Agora, olhe para o exemplo a seguir será usado nas excepções acima referidas:

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

Aqui, a linha mais importante élevantarFileSaveError.new ($!). Chamamos levantar esquematicamente exceção ocorreu, aprovou uma nova instância FileSaveError devido a anormalidades específicas causadas por dados de gravação falha.