Un programa en ejecución puede encontrarse con problemas inesperados. Podría no existir un fichero que desea leer, al salvar algunos datos se podría llenar un disco, un usuario podría introducir algún tipo de datos de entrada poco adecuados.
ruby> file = open("algun_fichero")
ERR: (eval):1:in `open': No such file or directory - "algun_fichero"
FILE *file = fopen("algun_fichero","r");
if (file == NULL) {
fprintf(stderr, "No existe el fichero\n");
exit(1);
}
bytes_read = fread(buf,1,bytes_desired,file);
if (bytes_read != bytes_desired) {
/* aquí, más gestión de errores ... */
}
...
En Ruby, como en muchos lenguajes modernos, se pueden gestionar las excepciones para bloques de código de una forma compartimentalizada, lo que permite tratar los imprevistos de forma efectiva sin cargar excesivamente ni al programador ni a cualquier otra persona que intente leer el código posteriormente. El bloque de código marcado con begin se ejecutará hasta que haya una excepción, lo que provoca que el control se transfiera a un bloque con el código de gestión de errores, aquel marcado con rescue. Si no hay excepciones, el código de rescue no se usa. El siguiente método devuelve la primera línea de un fichero de texto o nil si hay una excepción.
def first_line( filename )
begin
file = open(filename)
info = file.gets
file.close
info # Lo último que se evalúa es el valor devuelto
rescue
nil # No puedo leer el fichero, luego no devuelvo una cadena
end
end
begin
file = open("algun_fichero")
rescue
file = STDIN
end
begin
# ... procesamos la entrada ...
rescue
# ... aquí tratamos cualquier otra excepción
end
fname = "algun_fichero"
begin
file = open(fname)
# ... procesamos la entrada ...
rescue
fname = "STDIN"
retry
end
Toda librería Ruby genera una excepción si ocurre un error y se pueden lanzar excepciones explícitamente dentro del código. Para lanzar una excepción utilizamos raise. Tiene un argumento, la cadena que describe la excepción. El argumento es opcional pero no se debería omitir. Se puede acceder a él posteriormente a través de la variable global especial $!.