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.