Latest web development tutorials

excepción de ruby

Excepciones y ejecución están siempre unidas. Si abre un archivo que no existe, y no controla correctamente la situación, entonces el programa se considera que sea de baja calidad.

Si se produce una excepción, el programa se detiene. El manejo de excepciones para todos los tipos de errores que pueden ocurrir durante la ejecución del programa, por lo que tomar las medidas apropiadas, y no va a dejar que el programa se detuvo por completo.

Rubí proporciona un mecanismo perfecto para el manejo de excepciones. Podemos adjuntar el código que podría lanzar una excepción, y el uso de las cláusulasde rescatepara contar Rubí el tipo perfecto de excepción que se maneja en el bloquebegin / end.

gramática

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

Paraempezartodo desde elrescateestá protegida. Si durante la ejecución se produce de la excepción bloque de código, se pasa el control entre elextremoy elrescate de bloque.

Paraempezarbloque de cada cláusulade rescate,Ruby y la excepción lanzada a su vez a cada comparación de parámetros. Si el tipo de cláusula de rescate excepción de nomenclatura y excepción lanzada por la misma corriente, o es la clase padre de la excepción, el partido se ha realizado correctamente.

Si la excepción no coincide con cualquiera de los tipos de error especificado, podemos utilizar una cláusulaelsedespués de todo cláusula derescate.

Ejemplos

#!/usr/bin/ruby

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

Los ejemplos de la salida anterior se está ejecutando. Como se puedever,STDIN reemplazar elarchivo,porque el noabierta.

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

Uso Declaraciónde reintento

Usted puede utilizar el bloquede rescatepara detectar la excepción, y luego usar el bloque de instruccionesde reintentobeginempezardesde el principio.

gramática

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

Ejemplos

#!/usr/bin/ruby

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

El siguiente es el flujo del proceso:

  • Se produjo una excepción cuando se abre.
  • Saltar a rescatar. fnombre volver a ser destinado.
  • Pasar al principio empiezan por reintento.
  • El archivo se abre correctamente.
  • Continuar el proceso básico.

Nota: Si no existe el archivo cambiado el nombre, el código fuerzas intentos ilimitados.Por lo que el manejo de excepciones, usarreintento precaución.

Uso Declaración deaumento

Puede utilizar la instrucciónaumentose produce una excepción. El siguiente método produce una excepción cuando se llama. Su segundo mensaje se emitirá.

gramática

raise 

或

raise "Error Message" 

或

raise ExceptionType, "Error Message"

或

raise ExceptionType, "Error Message" condition

La primera forma simplemente volver a lanzar la excepción actual (si no hay excepción actual se lanza RuntimeError). Esto se utiliza para explicar antes de que el controlador de excepciones excepción excepción entrante.

La segunda forma crea una nueva excepciónRuntimeError,estableciendo su mensaje a la cadena dada. Después de la pila de llamadas para lanzar la excepción.

Una tercera forma del primer parámetro para crear una excepción, a continuación, establecer los mensajes relacionados como el segundo parámetro.

La cuarta forma y la tercera forma es similar, puede añadir cualquier declaración condicional adicionales (por ejemplo,a menos)para lanzar una excepción.

Ejemplos

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

Ejecutar la salida anterior ejemplo es:

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

Otro de los ejemplos de usoplanteandemostración:

#!/usr/bin/ruby

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

Ejecutar la salida anterior ejemplo es:

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

Asegurarel uso de declaraciones

A veces, sin importar si se produce una excepción, es necesario asegurarse de que algún proceso se completa al final del bloque de código. Por ejemplo, es posible abrir un archivo en el momento de la entrada, cuando se sale del bloque, lo que necesita para asegurarse de cerrar el archivo.

asegurar lacláusula que hacer es esto. garantizar colocado después de la última cláusula de rescate y contiene un bloque de código de terminación de bloque se ejecuta siempre. Es normal para salir del bloque, lanzar y controlar las excepciones si, ya sea debido a una excepción no capturada termina, ninguna de estasrelaciones,aseguran bloque siempre se ejecutará.

gramática

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

Ejemplos

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

Ejecutar la salida anterior ejemplo es:

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

El uso deelse

Si no se proporciona la cláusulaotra cosa,por lo general se coloca después de la cláusula derescate,antes de cualquiergarantizar.

se ejecuta el cuerpo cláusulaelsesólo cuando el cuerpo de código sin lanzar una excepción.

gramática

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

Ejemplos

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

Ejecutar la salida anterior ejemplo es:

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

Uso $! Variable puede coger el mensaje de error que se produce.

Capturar y lanzar

subir y mecanismo de excepciones de rescate puede renunciar a la ejecución cuando se produce un error, a veces es necesario para saltar en el proceso normal de alguna estructura anidada. En este punto de captura y un tiro muy útil.

reténdefine un nombre dado (puede ser un símbolo o cadena) etiqueta como un bloque. El bloque se procesa normalmente sabe encuentros un tiro.

gramática

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

或

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

Ejemplos

En el siguiente ejemplo, si un usuario escribe '! "Responder a cualquier pregunta, utilice un tiro de interrumpir la interacción con el usuario.

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

El programa anterior requiere la interacción humana, puede probar en su ordenador. Ejecutar la salida anterior ejemplo es:

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

clase de excepción

clases y módulos estándar de Ruby lanzados. Todas las clases de excepción forman una jerarquía, incluyendo la parte superior de la clase de excepción interna. La siguiente capa es de siete tipos diferentes:

  • interrupción
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

Fatal es la capa de la otra excepción, pero el intérprete de Ruby sólo lo utilizan internamente.

ScriptError y StandardError tienen algunas subcategorías, pero aquí tenemos que saber estos detalles. Lo más importante es crear nuestra propia clase de excepción, tienen que ser una subclase de la clase de excepción o de su progenie.

Veamos un ejemplo:

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

Ahora, mira el siguiente ejemplo se utilizará en las anteriores excepciones:

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

En este caso, la línea más importante eselevarFileSaveError.new ($!). Hacemos un llamado a elevar de forma esquemática se ha producido una excepción, se aprobó una nueva instancia FileSaveError debido a las anormalidades específicas causadas por la falla de escritura de datos.