Aquí hay un hecho interesante: No código está libre de errores; de hecho, algunos códigos están llenos de "errores" a propósito.
¿Qué es un error en una aplicación? Un error es una solución codificada incorrectamente a un problema. Tales son errores lógicos eso podría conducir a resultados de función incorrectos donde todo parece estar bien organizado pero el resultado de la aplicación es completamente inutilizable. Con errores lógicos, un solicitud podría o no dejar de funcionar.
Las excepciones pueden incluir errores en su código donde intenta dividir números con cero, o intenta usar bloques de memoria liberados o intenta proporcionar parámetros incorrectos a una función. Sin embargo, una excepción en una aplicación no siempre es un error.
Excepciones y la clase de excepción
Las excepciones son condiciones especiales que requieren un manejo especial. Cuando ocurre una condición de tipo error, el programa genera una excepción.
Usted (como escritor de la aplicación) manejará las excepciones para hacer que su aplicación sea más propensa a errores y responder a la condición excepcional.
En la mayoría de los casos, se encontrará siendo el escritor de la aplicación y también el escritor de la biblioteca. Por lo tanto, necesitaría saber cómo generar excepciones (desde su biblioteca) y cómo manejarlas (desde su aplicación).
El artículo sobre manejo de errores y excepciones proporciona algunas pautas básicas sobre cómo protegerse contra errores utilizando los bloques protegidos try / except / end y try / finally / end para responder o manejar condiciones excepcionales.
Un simple intento / excepto bloquear bloques se ve así:
tratar
ThisFunctionMightRaiseAnException ();
excepto// maneje las excepciones generadas en ThisFunctionMightRaiseAnException () aquí
final;
ThisFunctionMightRaiseAnException podría tener, en su implementación, una línea de código como
aumento Excepción. Crear ('condición especial');
La excepción es una clase especial (una de las pocas sin una T delante del nombre) definida en la unidad sysutils.pas. La unidad SysUtils define varios descendientes de excepción de propósito especial (y por lo tanto crea una jerarquía de clases de excepción) como ERangeError, EDivByZero, EIntOverflow, etc.
En la mayoría de los casos, las excepciones que manejaría en el bloque try / except protegido no serían de la excepción (base) pero de alguna clase descendiente de excepción especial definida en el VCL o en la biblioteca que eres utilizando.
Manejo de excepciones usando Try / Except
Para atrapar y manejar un tipo de excepción, construiría un manejador de excepciones "on type_of_exception do". El "a excepción do" se parece bastante a la clásica declaración de caso:
tratar
ThisFunctionMightRaiseAnException;
excepto en EZeroDivide dobegin// algo al dividir por cerofinal;
en EIntOverflow dobegin// algo cuando un cálculo entero demasiado grandefinal;
elsebegin// algo cuando se generan otros tipos de excepciónfinal;
final;
Tenga en cuenta que la parte else tomaría todas las (otras) excepciones, incluidas aquellas de las que no sabe nada. En general, su código debe manejar solo las excepciones que realmente sabe manejar y que espera lanzar.
Además, nunca debe "comer" una excepción:
tratar
ThisFunctionMightRaiseAnException;
excepto
final;
Comer la excepción significa que no sabe cómo manejar la excepción o no desea que los usuarios vean la excepción ni nada en el medio.
Cuando maneja la excepción y necesita más datos de ella (después de todo, es una instancia de una clase) en lugar de solo el tipo de excepción que puede hacer:
tratar
ThisFunctionMightRaiseAnException;
excepto en E: excepción dobegin
ShowMessage (E.Message);
final;
final;
La "E" en "E: Excepción" es una variable de excepción temporal del tipo especificado después del carácter de columna (en el ejemplo anterior, la clase de excepción base). Usando E, puede leer (o escribir) valores en el objeto de excepción, como obtener o establecer la propiedad Mensaje.
¿Quién libera la excepción?
¿Has notado cómo las excepciones son en realidad instancias de una clase que desciende de Exception? La palabra clave raise arroja una instancia de clase de excepción. Lo que crea (la instancia de excepción es un objeto), también necesita liberar. Si usted (como escritor de la biblioteca) crea una instancia, ¿la liberará el usuario de la aplicación?
Aquí esta la Delphi magia: manejar una excepción destruye automáticamente el objeto de excepción. Esto significa que cuando escribe el código en el bloque "excepto / fin", liberará la memoria de excepción.
Entonces, ¿qué sucede si ThisFunctionMightRaiseAnException realmente genera una excepción y no lo está manejando (esto no es lo mismo que "comerlo")?
¿Qué pasa cuando el número / 0 no se maneja?
Cuando se genera una excepción no controlada en su código, Delphi nuevamente maneja mágicamente su excepción al mostrar el diálogo de error al usuario. En la mayoría de los casos, este diálogo no proporcionará suficientes datos para que el usuario (y finalmente usted) comprenda la causa de la excepción.
Esto está controlado por el bucle de mensajes de nivel superior de Delphi donde todas el objeto de aplicación global y su método HandleException están procesando excepciones.
Para manejar excepciones globalmente y mostrar su propio diálogo más fácil de usar, puede escribir código para los eventos de aplicación. Controlador de eventos OnException.
Tenga en cuenta que el objeto de aplicación global se define en la unidad de formularios. TApplicationEvents es un componente que puede usar para interceptar los eventos del objeto de aplicación global.