El uso de try..excepto para el manejo de errores
obtener información sobre las excepciones y cómo escribir mejor código de control de errores. Aprender cómo Castalia nos puede ayudar a escribir más robusto y tolerante a fallos de código.
(publicado Originalmente en delphi-expert.com el 23 de Marzo de 2004)
Como se había prometido, hoy es la segunda parte de nuestra discusión de Delphi prueba de las construcciones. La semana pasada, nos fijamos en try..finalmente, se enteró de lo que se destina, cuando usarlo, y cómo Castalia nos puede ayudar a utilizar más eficazmente. Esta semana, vamos a examinar la otra mitad de la prueba de la familia, try..excepto y aprender cómo Castalia puede hacer que nuestra try..excepto uso más eficaz. También vamos a hacer la diversión de java.
Try..excepto es un constructo para el manejo de 'excepcional' de las situaciones en un programa. Un programa típico de flujo, que es un conjunto de instrucciones que procedan en orden. A veces esto implica el fin de las ramas, pero siempre hay un flujo lógico, y las decisiones de la rama de flujo se basan en algún estado del programa, como por ejemplo, si X es menor que 5.
a Veces, sin embargo, que el estado puede ser representado incorrecta. Vamos a tomar un ejemplo que podemos ver en el mundo real:
AssignFile(F, 'SomeFile.Txt')
ResetFile(F)
S := ReadLn(F)
CloseFile(F)
Este código se abrirá un archivo, leer una línea de ella, y la cierra de nuevo. Este es el flujo normal del programa. Sin embargo, una serie de supuestos que se hagan sobre este flujo. En primer lugar, asumimos que el archivo existe. Asumimos que podemos abrirlo para su lectura. Suponemos que hay una línea para ser leído. Etc...
Si alguno de estos supuestos, resulta ser falsa, entonces tenemos una situación excepcional! El flujo del programa va a estar en mal estado por el hecho de que algunos estados no es la situación que nos espera.
Hay varias formas de manejar estas situaciones excepcionales. Nos podría prescindir de ellos, y si alguno de ellos ocurre, el programa se bloqueará o hacer otra cosa igualmente irregulares. Pudimos comprobar de esas excepciones, la adición de un código como este:
si no FileExists('SomeFile.txt'), a continuación,
begin
WriteLn('el Archivo no existe')
Salir
fin
Este es el mejor. Para una cosa, usted ha dicho a los usuarios por qué el programa no funcionará. Para programas sencillos, esto funciona bien, pero a medida que el programa se vuelve más y más complejo, el estado del programa de manera exponencial compleja, y pronto usted será incapaz de comprobar todas las hipótesis. La comprobación de su hipótesis es una buena cosa, aunque. Volveremos a esto más tarde.
también podemos checkafter cada operación para asegurarse de que lo que se espera que ocurra. Este es el enfoque tradicional de C, y el enfoque de la API de Windows (y la mayoría de los otros sistema operativo Api, con BeOS como una notable excepción). En este modelo, cada función devuelve un código de error. Es su responsabilidad comprobar el código de error y ver si se trata de 'ACEPTAR' o alguna otra cosa, como FILE_NOT_FOUND. Entonces, una vez más, se informará al usuario y a la salida.
Este es, en definitiva, una variación sobre el mismo enfoque, sólo que esta vez estamos comprobación de la hipótesis después de hacer algo, en vez de antes. La ventaja es que cada función puede comprobar sus propios supuestos, y en el caso de la API de Windows, todos los posibles valores de retorno son bastante bien documentado, de modo que con disciplina de la escritura, en realidad, es posible controlar todas las condiciones, suponiendo que la persona que escribió el API se los llevó a todos sus hipótesis en consideración. El código escrito con este enfoque sería algo como esto (No, esto no es válido pascal, mis disculpas a los puristas):
ErrCode := AssignFile(F, 'SomeFile.Txt')
si ErrCode = FILE_NOT_FOUND, a continuación,
begin
WriteLn('No se Encuentra el Archivo')
Salir
fin
ErrCode := ResetFile(F)
si ErrCode = FILE_NO_ACCESS, a continuación,
begin
WriteLn('Usted don't tiene acceso a hacer eso.')
Salir
else
si ErrCode = FILE_ALREADY_OPEN, a continuación,
begin
WriteLn('Alguien más está leyendo el archivo')
Salir
fin
ErrCode := ReadLn(F, S) //Vamos a suponer que esto significa leer a partir de F en S
si ErrCode = NOT_ENOUGH_TEXT, a continuación,
begin
WriteLn('No es Suficiente Texto')
Salir
fin
CloseFile(F)
Usted consigue la idea. Podría ser mucho peor, pero nuestro programa se ha puesto realmente complejo muy rápidamente, y todo para dar cabida a cosas que normalmente no sucede.
Así, alguien en el último par de décadas había una idea nueva. ¿Por qué no crear una estructura de control específicamente para situaciones excepcionales? Este nuevo podría estructura de control nos permitiría definir lo que debe suceder normalmente y, a continuación, definir lo que debe suceder si algo va mal. Esto se conoce como 'manejo de excepciones.'
La idea básica detrás de una excepción es que suponemos que el flujo normal de control que va a tener lugar. Si no, que al instante detener la ejecución dondequiera que estemos y a la salida de la función actual. Nosotros, a continuación, salir de la función que se llama a esa función, y así sucesivamente, hasta que llegamos a un controlador de excepción, que es un bloque de código que se ejecuta sólo cuando un excepcional estado o evento se lleva a cabo. Si el flujo normal de ejecución es seguido, los controladores de excepciones son ignorados.
En Delphi, el flujo normal de ejecución es de un bloque try, y el controlador de excepciones es una excepción bloque. He aquí un ejemplo sencillo:
prueba
AssignFIle(F, 'SomeFile.txt')
ResetFile(F)
S := Readln(F)
CloseFile(F)
excepto
WriteLn('error')
fin
Este es el limpiador, y nos permite ver claramente cuál es el código esperamos ser ejecutado normalmente, y lo que el código debe ser ejecutado cuando algo extraño sucede (no como último ejemplo... estremecimiento).
por supuesto, sería agradable ser capaz de decirle al usuario exactamente lo que ocurrió el error. Manejo de excepciones que hace de esta una brisa demasiado. Desde el manejo de excepciones desarrollado de la mano con la programación orientada a objetos, lo que se denomina objetos de excepción fueron concebidos. El objeto de excepción se crea automáticamente cuando se produce una excepción. Si queremos utilizar el objeto de excepción, ampliamos el try..excepto una sintaxis como esta:
prueba
AssignFile(F, 'SomeFile.txt')
ResetFile(F)
S := Readln(F)
CloseFile(F)
excepto
en E: Exception
WriteLn(E. Mensaje)
fin
Se puede ver, cada excepción tiene un Mensaje de propiedad que da una breve información útil acerca de la excepción específica. Puede contener la cadena 'Archivo No Encontrado' o 'el Archivo ya está en uso', o algo más que le gustaría decirle al usuario.
Hay diferentes tipos de excepciones, y podemos tomar ventaja de eso. Tal vez queremos hacer algo especial cuando una cierta excepción ocurre. Tal vez queremos pitido si no se encuentra el archivo:
prueba
AssignFile(F, 'SomeFile.txt')
ResetFile(F)
S := REadln(F)
CloseFIle(F)
excepto
en E: FileNotFound hacer
Pitido
en E: Exception
WriteLn(E. Mensaje)
fin
tenga en cuenta que cuando nosotros nos encargamos de varias excepciones, la mayoría de excepción específica debe ir primero. Esto es porque las excepciones son polimórficos, es decir, la Excepción es CADA excepción, y EFileNotFound es una Excepción, así que si la Excepción se maneja en primer lugar, EFileNotFound nunca va a ser manejado.
Uno de los problemas de este mecanismo es que todavía no estamos seguros de qué excepciones de una determinada función o procedimiento podría aumentar. Algunos lenguajes o herramientas de desarrollo de disponer de un mecanismo para ayudarle a saber lo que podría ser elevado. Una C# IDE, por ejemplo, le dará una pista pequeña ventana para decirle lo excepciones que debe manejar cada vez que utilice una función. Java es notorio (y odiado por muchos) por el hecho de que se aplica la excepción de manejo de terroristas con celo. El código no compila si no se manejan las excepciones que ella quiere que usted, incluso si usted SABE que esas excepciones no va a suceder, ya sea porque usted tiene el control sobre el entorno de ejecución, ya que el código ya ha prechecked la condición y se aseguró de que la excepción no puede ser lanzado. Java hará cumplir su estilo de código a la última jota y la tilde, si te gusta o no.
por desgracia, no existe esa herramienta existe para Delphi. Mientras escribo esto, estoy empezando a pensar que podría ser una buena cosa para agregar a Castalia. Voy a tener que echarle un vistazo a eso.
¡Uf!
Que tenía tres años y medio de páginas de Microsoft Word, para comprender de qué es una excepción. Ahora para las cosas divertidas:
Castalia puede ayudarle a escribir su normal código y el código de control de excepciones. Castalia el código de las plantillas de definir un trye de la plantilla que crea automáticamente un try..excepto bloque para usted y establece los puntos de entrada de modo que usted puede crear correctamente su código. Esto le ahorrará más las pulsaciones de teclado y más tiempo que el que te das cuenta!
Castalia las herramientas de refactorización proporcionar un sistema automatizado de surround con... de refactorización que va a poner un try..excepto en bloque de todo su código. Simplemente tienes que marcar el flujo normal de control de código, haga clic en el editor (o pulse Mayúsculas + Ctrl R), y seleccione el elemento correspondiente en el menú refactorización. El código será cambiado automáticamente.
Esta semana, hemos aprendido lo que la pruebe..excepto bloque es y de donde vino (y por qué es el mejor manejo de errores mecanismo aún). También hemos aprendido cómo Castalia puede hacer uso de esta poderosa estructura de control para escribir más robusto y fácil de usar código.
Para obtener más información acerca de Castalia de plantillas de código, haga clic aquí.
Para obtener más información acerca de Castalia automatizado de refactorings, haga clic aquí
Para comprar Castalia ahora porque este artículo fue la mejor cosa que usted ha leído alguna vez, haga clic aquí, a continuación, haga clic en aquí para leer un libro mucho mejor.
El uso de try..excepto para el manejo de errores
El uso de try..excepto para el manejo de errores : Multi-millones de consejos para hacer su vida mas facil.
obtener informacion sobre las excepciones y como escribir mejor codigo de control de errores. Aprender como Castalia nos puede ayudar a escribir mas robusto y tolerante a fallos de codigo.
(publicado Originalmente en delphi-expert.com el 23 de Marzo de 2004)
Como se habia prometido, hoy es la segunda parte de nuestra discusion de Delphi prueba de las construcciones. La semana pasada, nos fijamos en try..finalmente, se entero de lo que se destina, cuando usarlo, y como Castalia nos puede ayudar a utilizar mas eficazmente. Esta semana, vamos a examinar la otra mitad de la prueba de la familia, try..excepto y aprender como Castalia puede hacer que nuestra try..excepto uso mas eficaz. Tambien vamos a hacer la diversion de java.
Try..excepto es un constructo para el manejo de 'excepcional' de las situaciones en un programa. Un programa tipico de flujo, que es un conjunto de instrucciones que procedan en orden. A veces esto implica el fin de las ramas, pero siempre hay un flujo logico, y las decisiones de la rama de flujo se basan en algun estado del programa, como por ejemplo, si X es menor que 5.
a Veces, sin embargo, que el estado puede ser representado incorrecta. Vamos a tomar un ejemplo que podemos ver en el mundo real:
AssignFile(F, 'SomeFile.Txt')
ResetFile(F)
S := ReadLn(F)
CloseFile(F)
Este codigo se abrira un archivo, leer una linea de ella, y la cierra de nuevo. Este es el flujo normal del programa. Sin embargo, una serie de supuestos que se hagan sobre este flujo. En primer lugar, asumimos que el archivo existe. Asumimos que podemos abrirlo para su lectura. Suponemos que hay una linea para ser leido. Etc...
Si alguno de estos supuestos, resulta ser falsa, entonces tenemos una situacion excepcional! El flujo del programa va a estar en mal estado por el hecho de que algunos estados no es la situacion que nos espera.
Hay varias formas de manejar estas situaciones excepcionales. Nos podria prescindir de ellos, y si alguno de ellos ocurre, el programa se bloqueara o hacer otra cosa igualmente irregulares. Pudimos comprobar de esas excepciones, la adicion de un codigo como este:
si no FileExists('SomeFile.txt'), a continuacion,
begin
WriteLn('el Archivo no existe')
Salir
fin
Este es el mejor. Para una cosa, usted ha dicho a los usuarios por que el programa no funcionara. Para programas sencillos, esto funciona bien, pero a medida que el programa se vuelve mas y mas complejo, el estado del programa de manera exponencial compleja, y pronto usted sera incapaz de comprobar todas las hipotesis. La comprobacion de su hipotesis es una buena cosa, aunque. Volveremos a esto mas tarde.
tambien podemos checkafter cada operacion para asegurarse de que lo que se espera que ocurra. Este es el enfoque tradicional de C, y el enfoque de la API de Windows (y la mayoria de los otros sistema operativo Api, con BeOS como una notable excepcion). En este modelo, cada funcion devuelve un codigo de error. Es su responsabilidad comprobar el codigo de error y ver si se trata de 'ACEPTAR' o alguna otra cosa, como FILE_NOT_FOUND. Entonces, una vez mas, se informara al usuario y a la salida.
Este es, en definitiva, una variacion sobre el mismo enfoque, solo que esta vez estamos comprobacion de la hipotesis despues de hacer algo, en vez de antes. La ventaja es que cada funcion puede comprobar sus propios supuestos, y en el caso de la API de Windows, todos los posibles valores de retorno son bastante bien documentado, de modo que con disciplina de la escritura, en realidad, es posible controlar todas las condiciones, suponiendo que la persona que escribio el API se los llevo a todos sus hipotesis en consideracion. El codigo escrito con este enfoque seria algo como esto (No, esto no es valido pascal, mis disculpas a los puristas):
ErrCode := AssignFile(F, 'SomeFile.Txt')
si ErrCode = FILE_NOT_FOUND, a continuacion,
begin
WriteLn('No se Encuentra el Archivo')
Salir
fin
ErrCode := ResetFile(F)
si ErrCode = FILE_NO_ACCESS, a continuacion,
begin
WriteLn('Usted don't tiene acceso a hacer eso.')
Salir
else
si ErrCode = FILE_ALREADY_OPEN, a continuacion,
begin
WriteLn('Alguien mas esta leyendo el archivo')
Salir
fin
ErrCode := ReadLn(F, S) //Vamos a suponer que esto significa leer a partir de F en S
si ErrCode = NOT_ENOUGH_TEXT, a continuacion,
begin
WriteLn('No es Suficiente Texto')
Salir
fin
CloseFile(F)
Usted consigue la idea. Podria ser mucho peor, pero nuestro programa se ha puesto realmente complejo muy rapidamente, y todo para dar cabida a cosas que normalmente no sucede.
Asi, alguien en el ultimo par de decadas habia una idea nueva. ¿Por que no crear una estructura de control especificamente para situaciones excepcionales? Este nuevo podria estructura de control nos permitiria definir lo que debe suceder normalmente y, a continuacion, definir lo que debe suceder si algo va mal. Esto se conoce como 'manejo de excepciones.'
La idea basica detras de una excepcion es que suponemos que el flujo normal de control que va a tener lugar. Si no, que al instante detener la ejecucion dondequiera que estemos y a la salida de la funcion actual. Nosotros, a continuacion, salir de la funcion que se llama a esa funcion, y asi sucesivamente, hasta que llegamos a un controlador de excepcion, que es un bloque de codigo que se ejecuta solo cuando un excepcional estado o evento se lleva a cabo. Si el flujo normal de ejecucion es seguido, los controladores de excepciones son ignorados.
En Delphi, el flujo normal de ejecucion es de un bloque try, y el controlador de excepciones es una excepcion bloque. He aqui un ejemplo sencillo:
prueba
AssignFIle(F, 'SomeFile.txt')
ResetFile(F)
S := Readln(F)
CloseFile(F)
excepto
WriteLn('error')
fin
Este es el limpiador, y nos permite ver claramente cual es el codigo esperamos ser ejecutado normalmente, y lo que el codigo debe ser ejecutado cuando algo extraño sucede (no como ultimo ejemplo... estremecimiento).
por supuesto, seria agradable ser capaz de decirle al usuario exactamente lo que ocurrio el error. Manejo de excepciones que hace de esta una brisa demasiado. Desde el manejo de excepciones desarrollado de la mano con la programacion orientada a objetos, lo que se denomina objetos de excepcion fueron concebidos. El objeto de excepcion se crea automaticamente cuando se produce una excepcion. Si queremos utilizar el objeto de excepcion, ampliamos el try..excepto una sintaxis como esta:
prueba
AssignFile(F, 'SomeFile.txt')
ResetFile(F)
S := Readln(F)
CloseFile(F)
excepto
en E: Exception
WriteLn(E. Mensaje)
fin
Se puede ver, cada excepcion tiene un Mensaje de propiedad que da una breve informacion util acerca de la excepcion especifica. Puede contener la cadena 'Archivo No Encontrado' o 'el Archivo ya esta en uso', o algo mas que le gustaria decirle al usuario.
Hay diferentes tipos de excepciones, y podemos tomar ventaja de eso. Tal vez queremos hacer algo especial cuando una cierta excepcion ocurre. Tal vez queremos pitido si no se encuentra el archivo:
prueba
AssignFile(F, 'SomeFile.txt')
ResetFile(F)
S := REadln(F)
CloseFIle(F)
excepto
en E: FileNotFound hacer
Pitido
en E: Exception
WriteLn(E. Mensaje)
fin
tenga en cuenta que cuando nosotros nos encargamos de varias excepciones, la mayoria de excepcion especifica debe ir primero. Esto es porque las excepciones son polimorficos, es decir, la Excepcion es CADA excepcion, y EFileNotFound es una Excepcion, asi que si la Excepcion se maneja en primer lugar, EFileNotFound nunca va a ser manejado.
Uno de los problemas de este mecanismo es que todavia no estamos seguros de que excepciones de una determinada funcion o procedimiento podria aumentar. Algunos lenguajes o herramientas de desarrollo de disponer de un mecanismo para ayudarle a saber lo que podria ser elevado. Una C# IDE, por ejemplo, le dara una pista pequeña ventana para decirle lo excepciones que debe manejar cada vez que utilice una funcion. Java es notorio (y odiado por muchos) por el hecho de que se aplica la excepcion de manejo de terroristas con celo. El codigo no compila si no se manejan las excepciones que ella quiere que usted, incluso si usted SABE que esas excepciones no va a suceder, ya sea porque usted tiene el control sobre el entorno de ejecucion, ya que el codigo ya ha prechecked la condicion y se aseguro de que la excepcion no puede ser lanzado. Java hara cumplir su estilo de codigo a la ultima jota y la tilde, si te gusta o no.
por desgracia, no existe esa herramienta existe para Delphi. Mientras escribo esto, estoy empezando a pensar que podria ser una buena cosa para agregar a Castalia. Voy a tener que echarle un vistazo a eso.
¡Uf!
Que tenia tres años y medio de paginas de Microsoft Word, para comprender de que es una excepcion. Ahora para las cosas divertidas:
Castalia puede ayudarle a escribir su normal codigo y el codigo de control de excepciones. Castalia el codigo de las plantillas de definir un trye de la plantilla que crea automaticamente un try..excepto bloque para usted y establece los puntos de entrada de modo que usted puede crear correctamente su codigo. Esto le ahorrara mas las pulsaciones de teclado y mas tiempo que el que te das cuenta!
Castalia las herramientas de refactorizacion proporcionar un sistema automatizado de surround con... de refactorizacion que va a poner un try..excepto en bloque de todo su codigo. Simplemente tienes que marcar el flujo normal de control de codigo, haga clic en el editor (o pulse Mayusculas + Ctrl R), y seleccione el elemento correspondiente en el menu refactorizacion. El codigo sera cambiado automaticamente.
Esta semana, hemos aprendido lo que la pruebe..excepto bloque es y de donde vino (y por que es el mejor manejo de errores mecanismo aun). Tambien hemos aprendido como Castalia puede hacer uso de esta poderosa estructura de control para escribir mas robusto y facil de usar codigo.
Para obtener mas informacion acerca de Castalia de plantillas de codigo, haga clic aqui.
Para obtener mas informacion acerca de Castalia automatizado de refactorings, haga clic aqui
Para comprar Castalia ahora porque este articulo fue la mejor cosa que usted ha leido alguna vez, haga clic aqui, a continuacion, haga clic en aqui para leer un libro mucho mejor.
El uso de try..excepto para el manejo de errores
By Consejos Y Trucos
El uso de try..excepto para el manejo de errores : Multi-millones de consejos para hacer su vida más fácil.