2.2. Excepciones

El manejo de todos los errores en eBox está implementado con excepciones del estilo de Java. Éstas están provistas por el módulo de perl Error. Puede leer la documentación de perl para ese módulo para obtener una descripción detallada de cómo utilizar las excepciones en perl. Las excepciones de eBox están definidas en el espacio de nombres EBox::Exceptions.

eBox provee una jerarquía de excepciones de la cual puede elegir la más apropiada para cada situación. Todas las excepciones de eBox heredan de una de estas dos:

La diferencia entre estos dos tipos es que el usuario verá cuando una excepción no ha sido capturada. La plataforma del interfaz de usuario mostrará el mensaje contenido en la excepción sin alterarlo si la excepción es una de tipo externo. Debería usar excepciones externas para los errores introducidos por el usuario, como un error de sintaxis en una dirección IP dada por el interfaz de usuario al backend del módulo.

Si la excepción es interna se registrará el error y se asumirá que algo falló internamente en eBox (un bug) o en el sistema en general. Cuando una excepción interna se captura por GUI el usuario verá un mensaje de error genérico. Cualquier excepción, interna o externa, puede ser utilizada internamente para otros propósitos, siempre que sea capturada antes de que recorra todo el camino hasta la GUI.

Si no puede encontrar una excepción para ciertas condiciones de error, tiene dos opciones: crear una nueva clase de excepción, heredándola de EBox::Exceptions::External o EBox::Exceptions::Internal, o usar únicamente una de estas dos clases como excepciones genéricas:

Ejemplo 2.3. Lanzando una excepción interna genérica

if ($foo_condition) {
	throw EBox::Exceptions::Internal('Algo ha pasado!!');
}

Como puede ver, lanzar excepciones sigue una sintaxis muy similar a Java. Capturarlas también es muy similar:

Ejemplo 2.4. Capturando una excepción

use Error qw(:try);

sub foo
{
	my $bar = shift;

	try {
		$bar->doSomething();
	} catch EBox::Exceptions::Base with {
		# no hace nada, sólo se ignora el error
	};
}

Puede hacer lo que quiera dentro de la sección “catch”. Puede escribir varias secciones “catch” si necesita hacer diferentes cosas para diferentes tipos de excepción. Las secciones “otherwise” y “finally” también están permitidas. Para una explicación detallada sobre éstas, únicamente ejecute perldoc Error. Un detalle muy importante es no olvidar el punto y coma después de la última sección (el “catch” en el ejemplo). No hacerlo puede producir resultados inesperados, esto se debe a la magia negra que es utilizada en la implementación del try-catch en perl.