try - manejo de excepciones en delphi
¿Cómo puedo averiguar qué excepciones podría arrojar una función Delphi? (10)
¿Hay una buena manera de descubrir qué excepciones puede plantear un procedimiento / función en Delphi (incluidos los procedimientos / funciones)?
En Java, siempre debe declarar qué excepciones se pueden lanzar, pero este no es el caso en Delphi, lo que podría generar excepciones no controladas.
¿Hay alguna herramienta de análisis de código que detecte excepciones no controladas?
(Editar: ahora es obvio que la pregunta se refería solo a la verificación del tiempo de diseño).
Nueva respuesta:
No puedo decir si hay alguna herramienta para verificar esto. Pascal Analyzer, por ejemplo, no.
Sin embargo, puedo decirle que en la mayoría de las aplicaciones de Delphi, incluso si hubiera una herramienta para verificar esto, no obtendrá ningún resultado.
¿Por qué? Porque el bucle de mensaje principal en TApplication.Run () ajusta todas las llamadas a HandleMessage () en un bloque de manejo de excepciones, que captura todos los tipos de excepción. Por lo tanto, tendrá una gestión de excepciones implícita / predeterminada en torno al 99,999% del código en la mayoría de las aplicaciones. Y en la mayoría de las aplicaciones, este manejo de excepciones será alrededor del 100% de su propio código: el 0.001% del código que no está incluido en el manejo de excepciones será el código generado automáticamente.
Si hubiera una herramienta disponible para verificar esto, deberá volver a escribir Application.run () de manera que no incluya el manejo de excepciones.
(Respuesta anterior: El controlador de eventos Application.OnException se puede asignar para capturar todas las excepciones que no manejan otros manejadores de excepciones. Aunque esto es tiempo de ejecución, y quizás no sea exactamente lo que está buscando (parece que quiere identifíquelos en el momento del diseño), le permite atrapar cualquier excepción que no se maneje en otro lugar. Junto con herramientas como JCLDebug en la Biblioteca de códigos Jedi , puede registrar un seguimiento de pila para averiguar dónde y por qué se produjo una excepción. lo que permitiría una mayor investigación y agregaría un manejo o prevención de excepciones específicas en torno al código de culpa ... )
Cualquier excepción que no se maneje de manera explícita o general en un nivel específico se filtre hacia arriba en la pila de llamadas. Delphi RTL (Run Time Library) generará un conjunto de diferentes clases de excepciones (errores matemáticos, errores de acceso, errores específicos de clase, etc.). Puede elegir manejarlos específicamente o generalmente en los diferentes intentos, excepto en los bloques.
Realmente no necesita declarar ninguna clase de excepción nueva a menos que necesite propagar un contexto funcional específico con la excepción.
Como escribieron los comentadores anteriores, también puede agregar una madre de todos los manejadores de excepciones como MadExcept o EurekaLog para atrapar lo no capturado.
editar: este es un seguro general contra las excepciones no controladas
try
ThisFunctionMayFail;
except
// but it sure won''t crash the application
on e:exception
do begin
// something sensible to handle the error
// or perhaps log and/or display the the generic e.description message
end
end;
Eche un vistazo a http://www.madshi.net/madExceptDescription.htm
Excepto por un escaneo en la palabra clave "aumentar", Delphi no tiene una construcción de lenguaje que le indique al lector casual qué excepciones se pueden esperar de un método.
En tiempo de ejecución, se podría agregar un manejador de excepción catch-all en cada método, pero eso no es aconsejable, ya que ralentizará la velocidad de ejecución. (Y es engorroso hacerlo también).
Agregar un bloque de manejo de excepciones a un método le agregará algunas instrucciones de ensamblaje (incluso cuando la excepción no se active), que forma una desaceleración medible cuando se llama al método muy a menudo.
Existen algunas bibliotecas que pueden ayudarlo a analizar las excepciones de tiempo de ejecución, como madExcept , JclDebug y EurekaLog . Estas herramientas pueden registrar todo tipo de detalles sobre la excepción, ¡es muy recomendable usar una de ellas!
Para el tiempo de ejecución prueba Eurekalog . No sé si existe una herramienta para el tiempo de diseño. Tendrá más dificultades aun cuando tenga código de terceros sin fuente. No es necesario que Delphi capture excepciones, por lo que no tiene que declararlas como en Java.
Lo que quería decir es que Delphi no requiere que se maneje una excepción. Simplemente terminará el programa. EurekaLog proporciona medios para registrar las excepciones manejadas y no controladas y proporcionar una gran cantidad de información sobre el estado del programa cuando se produjo la excepción, incluida la línea de código en la que se produjo y la pila de llamadas en ese momento.
Supongo que intentas que Delphi se comporte como Java, lo cual no es un buen enfoque. Aconsejo no preocuparse demasiado por las excepciones no controladas. En el peor de los casos, aparecerán en el manejador de excepciones VCL genérico y generarán un cuadro de diálogo de mensaje de Windows. En una aplicación normal, no detendrán la aplicación.
Un código bien escrito documentaría las diferentes excepciones que pueden surgir para que pueda manejarlas de una manera significativa. No se recomiendan los manipuladores Catch-all ya que realmente no hay forma de saber qué hacer si no sabe por qué surgió una excepción. También puedo recomendar encarecidamente MadExcept.
Seré el segundo (o tercero) MadExcept . Lo he estado utilizando con éxito en varias aplicaciones comerciales sin ningún problema. Lo bueno de MadExcept es que generará un informe para ti con un seguimiento completo de la pila que, en general, te orientará en la dirección correcta en cuanto a qué salió mal, e incluso puede incluir una captura de pantalla, así como ha recibido este mensaje automáticamente por correo electrónico. desde la computadora del cliente con un simple clic del mouse.
Sin embargo, no desea utilizar esto para TODAS las excepciones, solo para detectar las que extraña. Por ejemplo, si abre una base de datos y el inicio de sesión falla, sería mejor que atrape y maneje esta usted mismo en lugar de darle al usuario el error predeterminado de MadExcept en su mensaje de aplicación.
Como señala Jim McKeeth, no se puede obtener una respuesta definitiva, pero me parece que se podría responder parcialmente a la pregunta mediante un análisis estático: dada una función / procedimiento particular, se puede construir un gráfico de llamadas. Compruebe cada una de las funciones en ese gráfico de llamadas para una declaración de aumento. Eso le diría, por ejemplo, que TIdTcpClient.ReadString puede generar un EIdNotConnected (entre otros).
Un analizador inteligente también podría notar que algún código usa el operador / e incluye EDivByZero como una posibilidad, o que algún procedimiento accede a una matriz e incluye ERangeError.
Esa respuesta es un poco más estricta que simplemente grepping para "raise".
Las respuestas cortas es que no existe una herramienta que haga lo que usted dice, e incluso un escaneo para la palabra clave aumentar no lo llevaría allí. EAccessViolation o EOutOfMemory son solo dos de una serie de excepciones que podrían surgir casi en cualquier parte.
Una cosa fundamental acerca de Delphi es que las excepciones son jerárquicas: todas las excepciones de lenguaje definidas descienden de Exception , aunque vale la pena señalar que en realidad es posible generar cualquier descendiente TObject .
Si desea ver todas las excepciones que se plantean en un procedimiento en particular, simplemente envuélvalo en un bloque try / except , pero como se mencionó, esto no es recomendable .
// Other code . . .
try
SomeProcedure()
except // BAD IDEA!
ShowMessage(''I caught them all!'');
end;
Eso atrapará todo, incluso las instancias de un TObject elevado. Aunque yo diría que esto rara vez es el mejor curso de acción. Por lo general, desea utilizar un bloque try / finally y luego permitir que su manejador de excepción global (o un último bloque try / except ) maneje realmente las excepciones.
Las secciones de finalización de unidades también pueden generar excepciones. Estos se deslizarán por creo ... y también son un tanto problemáticos.
Creo que Delphi IDE tiene un "stack trace" incorporado o "stack tree" algo así como.
Esta pregunta me recuerda al juego TRussianRoulette de Skybuck ... googlearlo, su código y respuesta pueden ayudar.