Excepciones en Ruby

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