Se puede utilizar una de las clases Exceiption integradas o puedes crear una propia.
Si creas una propia, puede que quieras que sea una subclase de StandardError o de sus hijos. Si no, no será capturada por defecto.
Cada Excepction tiene asociada una cadena de mensaje y un trazado de pila.
nombre_fichero = "prueba.txt" fichero = File.open(nombre_fichero,"w") begin while data = socket.read(512) fichero.write(datos) end rescue SystemCallError $stderr.print "IO failed: " + $! fichero.close File.delete(nombre_fichero) raise end
Se pueden tener carias clausulas recue en un bloque begin.
Cada clausula rescue puede especificar múltiples excepciones a capturar.
begin eval string rescue SyntaxError, NameError => errorCompilacion print "String no compila:"+ errorCompilacion rescue StandardError => error print "Error al arrancar el script:"+error end
Realizar una Acción al Finalizar un Bloque salte o no una Excepción
ensure va después de la ultima clausula rescue y contiene un trozo de código que se ejecuta siempre cuando termina un bloque.
No importa si se cierra el bloque con normalidad o si termina por una excepción no capturada.
fichero = File.open("prueba.txt") begin #.... rescue #.... ensure fichero.close unless fichero.nil? end
Se puede utilizar la instrucción retry dentro una de una clausula rescue para repetir todo el bloque begin/end.
Ejemplo:
- Se intenta iniciar conexión con el puerto 8000,
- Si salta una excepción, cambia el booleano de puerto por defecto a false, y vuelve a ejecutar la función,
- Se intenta iniciar conexión con el puerto 8080
- Si salta una excepción, se lanza una excepción al llamador con el raise.
@puerto_defecto = true begin if @puerto_defecto then @conexion.iniciar(8000) else @conexion.iniciar(8080) end rescue ProtocolError if @puerto_defecto then @puerto_defecto = false retry else raise end end
LANZAR EXCEPCIONES
raise –> Relanza la excepcion actual o un RuntimeError si no es la excepcion en curso)
raise «Mala codificacion» –> Crea una nueva excepcion RuntimeError, estableciendo su mensaje a la cadena dada.
raise InterfaceException, «Fallo del teclado», caller –>
- 1º argumento crea una excepcion con ese nombre, normalmente el nombre de una clase de la jerarquia Exception.
- 2º argumento mensaje asociado a la excepcion,
- 3º argumento trazado de la pila
Catch y Throw