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.