Pregunta

Hay una buena manera de averiguar cuáles son las excepciones a una función/procedimiento puede aumentar en Delphi (incluyendo lo que se llama los procedimientos/funciones)?

En Java que siempre se han de declarar que las excepciones que pueden ser lanzadas, pero este no es el caso de Delphi, lo que podría llevar a las excepciones no controladas.

Existen herramientas de análisis de código que detecta las excepciones no controladas?

¿Fue útil?

Solución

(Edición:Ahora es obvio que la pregunta se refiere sólo a tiempo de diseño de la comprobación.)

Nueva respuesta:

Me pueden indicar si hay herramientas para comprobar esto por usted.Pascal Analizador, para uno, no.

Yo puede diré, sin embargo, que en la mayoría de las aplicaciones Delphi, incluso si no era una herramienta para comprobar esto para usted, usted podría obtener ningún resultado.

Por qué? Debido a que el principal mensaje de bucle en TApplication.Run() se ajusta a todos los HandleMessage() llama a una excepción en el manejo de bloque, que detecta todos los tipos de excepción.Por lo tanto va a tener implícito/default manejo de excepciones alrededor de 99,999% de código en la mayoría de las aplicaciones.Y en la mayoría de las aplicaciones, este manejo de excepciones será de alrededor de 100% de su propio código - el 0,001% de código que no está envuelto en el manejo de excepciones será el código generado automáticamente.

Si hay una herramienta disponible para comprobar esto para usted, usted tendría que reescribir la Aplicación.run() de tal forma que no incluye el manejo de excepciones.

(Respuesta anterior:La Aplicación.OnException controlador de eventos puede ser asignado para capturar todas las excepciones que no son manejados por otros controladores de excepciones.Mientras que este es el tiempo de ejecución, y por lo tanto quizás no es exactamente lo que está después (suena como usted desea identificar en tiempo de diseño), no permiten capturar cualquier excepción no manejada en otros lugares.En conjunto con herramientas tales como el JCLDebug cosas en el Código Jedi De La Biblioteca, usted podría iniciar una traza de la pila para averiguar dónde y por qué se produjo una excepción, que permite profundizar la investigación y la adición de excepción específica en el manejo o la prevención de los culpables de código...)

Otros consejos

Mi conjetura es que usted está tratando de hacer Delphi se comportan como Java, que no es un buen enfoque.Recomiendo a los que no se preocupe demasiado acerca de las excepciones no controladas.En el peor de los casos, que va de la burbuja hasta el genérico VCL controlador de excepciones y causar un mensaje de Windows de diálogo.En una aplicación normal, no van a detener la aplicación.

Bien escrito el código documento las diferentes excepciones que pueden ser planteadas de modo que usted puede manejar de una manera significativa.Captura todos los controladores no son recomendables ya que no hay realmente ninguna manera de saber qué hacer si usted no sabe por qué una excepción se produce.Yo también recomiendo madExcept.

Excepto para un análisis sobre el "aumento" de la palabra clave, no hay una construcción de lenguaje en Delphi que le dice al lector casual que las excepciones que se puede esperar de un método.

En tiempo de ejecución, se podría añadir un catch-all controlador de excepción en cada método, pero eso no es lo recomendable, ya que se ralentizará la velocidad de ejecución.(Y es engorroso hacer demasiado).

Añadir una excepción de bloque de control para que un método de añadir un par de instrucciones de montaje a él (incluso cuando la excepción no está activa), que forma apreciable desaceleración cuando el método se llama muy a menudo.

Existen un par de librerías que pueden ayudar en el análisis de las excepciones en tiempo de ejecución, como madExcept, JclDebug, y EurekaLog.Estas herramientas de registro de todo tipo de detalles acerca de la excepción, es altamente recomendable el uso de uno de esos!

Las respuestas cortas es que no hay una herramienta que hace lo que dices, e incluso un análisis de la elevar palabra clave no llegar allí. EAccessViolation o EOutOfMemory son sólo dos de una serie de excepciones que podrían obtener planteadas en cualquier lugar.

Una cosa fundamental acerca de Delphi es la excepciones son jerárquicos:Todo lenguaje definido excepciones descienden de Excepción, aunque vale la pena señalar que en realidad, es posible plantear cualquier TObject descendiente.

Si quieres captura cada excepción que se produce en un determinado procedimiento, basta con ponerla en un try / except bloque, pero como se ha mencionado esto no es recomendable.

// Other code . . . 
try
  SomeProcedure()
except  // BAD IDEA!
  ShowMessage('I caught them all!');
end;

Que atrapará a todo, incluso a instancias de un elevado TObject.Aunque yo diría que esto rara vez es el mejor curso de acción.Por lo general, usted desea utilizar un try / finally bloquear y, a continuación, permitir que su controlador de excepción (o uno final try / except bloque) para manejar las excepciones.

Voy a la segunda (o tercera) MadExcept.Lo he estado utilizando con éxito en varias aplicaciones comerciales sin ningún tipo de problemas.La cosa agradable sobre MadExcept es que va a generar un informe para un completo seguimiento de la pila que generalmente apuntan en la dirección correcta en cuanto a lo que salió mal, y puede incluso incluir una captura de pantalla, como bien se ha de tener presente de forma automática por correo electrónico desde el equipo de los clientes con un simple clic de ratón.

Sin embargo, usted no desea utilizar esta para TODAS las excepciones, sólo para atrapar a los que te puedes perder.Por ejemplo, si abre una base de datos y el error de inicio de sesión, sería mejor para usted para detectar y controlar esto, en lugar de dar al usuario la MadExcept de error por defecto en la aplicación ocurrió mensaje.

Cualquier excepción no explícitamente o por lo general se manejan en un nivel específico se goteo hacia arriba en la pila de llamadas.El Delphi RTL (Biblioteca en Tiempo de Ejecución) va a generar un conjunto de diferentes clases de excepción - (errores aritméticos, errores en el acceso, la clase específica de errores, etc).Usted puede elegir para manejar específicamente a ellos o, en general, en los diferentes trate, excepto los bloques.

Usted realmente no necesita declarar las nuevas clases de excepción, a menos que usted necesita para propagar un determinado contexto funcional, con la excepción.

Como los anteriores comentaristas escribió, también puede agregar una madre de todos los controladores de excepciones como MadExcept o EurekaLog para coger el no detectada.

editar:Esta es una póliza de seguro 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;

Para el tiempo de ejecución de probar Eurekalog.No sé si existe una herramienta para el tiempo de diseño.Usted tendrá más dificoulties incluso cuando usted tiene código de terceros sin el código fuente.No es necesario en Delphi para la captura de excepciones, así que usted no tiene que declarar como en Java.

Lo que yo quería decir es que Delphi no requiere que una excepción que se maneja.Se acaba de terminar el programa.EurekaLog proporciona los medios para registro de excepciones controladas y no controladas y ofrecen una gran riqueza de información sobre el estado del programa cuando se ha producido la excepción, incluyendo la línea de código que ocurrió a y la pila de llamadas en el tiempo.

Como Jim McKeeth señala, usted no puede obtener una respuesta definitiva, pero a mí me parece que uno podría parcialmente responder a la pregunta por algunos de análisis estático:de una determinada función o procedimiento, la construcción de una llamada gráfica.Revise cada una de las funciones de llamada de la gráfica para un aumento declaración.Que iba a decirle, por ejemplo, que TIdTcpClient.ReadString puede elevar a un EIdNotConnected (entre otros).

Un analizador inteligente posible que también tenga en cuenta que algunas código utiliza el operador / e incluyen EDivByZero como una posibilidad, o que de algún procedimiento de los accesos de una matriz y se incluyen ERangeError.

La respuesta es un poco más ajustado que simplemente grepping para "subir".

La finalización de las secciones de las unidades puede plantear excepciones también.Estos se deslizan por que pienso...y son también un poco problemático.

Creo IDE de Delphi tiene construir-en el "seguimiento de la pila" o "pila de árbol", algo así como.

Esta pregunta me recuerda a Skybuck del TRussianRoulette juego...google es, su código y la respuesta puede ayudar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top