en Este artículo se describe Delphi a intentar..finally, cuando a utilizar, y cómo Castalia hace que sea más fácil de usar.
(publicado Originalmente en delphi-expert.com el 16 de Marzo de 2004)
En una línea de negocios que me ha de examinar un montón de código fuente, a veces noto los hábitos y tendencias de los ciudadanos en el código. A veces estos hábitos son buenos, como el uso de afirmaciones. A veces los hábitos son malos, como el uso de etiquetas y gotos. A veces, el código es simplemente faltan algunos elementos muy importantes, ya sea por pereza o por la inadecuada comprensión por parte del programador que escribió el código. Una de estas construcciones, que es muy potente, pero a menudo descuidado y a veces mal, es de Delphi 'intentar' construir. Durante las próximas dos semanas, vamos a mirar lo que estas construcciones hacer y cómo los uso, y cómo Castalia puede ayudarle a utilizar de manera eficaz y no de la negligencia de ellos.
Esta semana, nos vamos a concentrar en el intento..finally. La próxima semana vamos a entrar en detalle con try..excepto, incluyendo un poco de historia sobre el concepto de excepciones. También vamos a hacer la diversión de java, que nos puede enseñar mucho con sus más de-the-top excepción mecanismo de control.
Presentación
a Veces, usted necesita para asegurarse de que ciertas cosas se hacen para completar una tarea, independientemente de los errores que se hayan producido en la ejecución de la tarea. Por ejemplo, si una rutina toma el control de un recurso, generalmente es necesario para la rutina para liberar el recurso, incluso si se producen errores en el proceso. Por ejemplo, en el código siguiente en un archivo de F es abierto, el texto está escrito para ella, y entonces es cerrado. El no cerrar el archivo podría resultar en una pérdida de recursos y sería una primera clase de error.
Reset(F)
WriteLn(F, 'Hola, Mundo!')
CloseFile(F)
Este código funciona bien mientras cada función se ejecuta normalmente, pero si algo anormal sucede, entonces no habrá problemas. Por ejemplo, si Reset(F) es correcta, pero por alguna razón la llamada a WriteLn falla, la rutina de salir sin intentar a CloseFile(F). Como resultado, el archivo nunca se cierra, y un recurso que se ha filtrado.
¿Cómo podemos resolver este problema? WriteLn no proporciona ningún mecanismo de comprobación de errores como algunas rutinas (más sobre esto la próxima semana). Simplemente se ejecuta, y si algo sale mal, se plantea una excepción (más sobre esto la próxima semana también). En pocas palabras, una excepción es una condición anormal en la ejecución de un programa que hace que el flujo de la interrupción del programa. Lo que necesitamos es una manera de asegurarse de que CloseFile(F) se llama incluso si se produce una excepción. Esto es exactamente lo que la pruebe..finally. Considerar el mismo código, pero protegidos con el control de flujo de un try-finally bloque:
Reset(F)
prueba
WriteLn(F, 'Hola, Mundo!')
finalmente
CloseFile(F)
fin
Ahora, nos hemos asegurado de que CloseFile(F) se llama no importa lo que suceda durante la llamada a WriteLn. Ahora, para una definición más formal, directamente de la ayuda de Delphi:
La sintaxis de un try..finalmente la instrucciónprueba statementList1, finalmente, statementList2
donde cada uno de los statementList es una secuencia de instrucciones delimitado por punto y coma. El try..finalmente instrucción se ejecuta la instrucción en el statementList1 (prueba de la cláusula). Si statementList1 acabados sin levantar excepciones, statementList2 (por último cláusula) es ejecutado. Si se produce una excepción durante la ejecución de las statementList1, el control se transfiere a la statementList2 statementList2 termine de ejecutar la excepción es una re-subida. Si una llamada a la Salir, Break o Continuar procedimiento de control de causas para dejar statementList1, statementList2 se ejecuta automáticamente. Así, el por último cláusula se ejecuta siempre, independientemente de cómo el prueba cláusula termina.
Ahora que tenemos una comprensión de la prueba..finalmente construir y cuándo usarlo, veamos cómo Castalia puede ayudar.
Plantillas de Código
Castalia proporciona una serie de plantillas de código que implican el trato..finally. Cuando se instala por primera vez, Castalia incluye el tryf y trycf plantillas. El tryf plantilla crea un simple esqueleto de un bloque try. El uso de la tryf plantilla, simplemente escribe 'tryf' en el editor y empuje la barra espaciadora. El esqueleto de código se inserta:
prueba
|
finalmente
|
fin
El cursor se ubicará en el lugar adecuado en el prueba de la cláusula. Después de crear el código en el prueba cláusula, pulse una vez para saltar a la por último de la cláusula. A continuación, crear su código de limpieza.
el trycf de la plantilla de direcciones de un particular uso común de la try..finalmente de la construcción en Delphi. Esta es la dinámica de creación y destrucción de objetos. Mal ejemplo:
Mistrings := TStringList.
Mistrings.Agregar('Hola')
Mistrings.Agregar(Mundo)
Mistrings.SaveToFile('hello.txt')
Mistrings.Gratis
Esto es similar a la del primer ejemplo. Un recurso (de memoria) está siendo asignado - en este caso por un constructor. El recurso está siendo manipulado, entonces el resoruce se cancela la asignación por el llamado Mistrings.Libre. Si no lo llamamos Mistrings.Libre, la memoria no se desasignan, y estaríamos buscando en otra pérdida de recursos. De nuevo, el problema es el mismo. Si algo va mal, mientras que la manipulación de la memoria, el destructor nunca es llamado y la memoria nunca es desasignado. Aquí está el código correspondiente:
Mistrings := TStringList.
prueba
Mistrings.Agregar('Hola')
Mistrings.Agregar(Mundo)
Mistrings.SaveToFile('hello.txt')
finalmente
Mistrings.Gratis
fin
Observe que Mistrings.Libre, ha sido trasladado a la finalmente de la cláusula, asegurándose de que no importa lo que sucede en el prueba cláusula, el objeto será liberado. Castalia del trycf plantilla proporciona un esqueleto para esta construcción. El uso de la trycf plantilla, escriba 'trycf' en el editor y pulse la barra espaciadora. El esqueleto de código se inserta:
| := |.
prueba
|
finalmente
|.Gratis
fin
El cursor se encuentra donde el primer carácter | es, y presionando saltará a cada uno | en orden. (La | los caracteres no aparecen en el código, pero se utilizan con el propósito de claridad). Usted debe utilizar el trycf de la plantilla siempre se están creando objetos de forma dinámica.
Usted puede aprender más acerca de Castalia el código de las plantillas aquí.
Refactorización
el Código de las plantillas son útiles cuando estamos escribiendo en un nuevo código, pero no ayudan mucho cuando estamos modificando el código existente de conformidad con nuestra nueva comprensión de try..finalmente. Castalia es refactorings va a ayudar con eso. La 'Envolvente Con...' refactorización permite seleccionar un bloque de código un try..finalmente bloque a su alrededor con sólo unos clics del ratón. Simplemente seleccione el código que va en el prueba cláusula y haga clic con el botón derecho del ratón. Desde el 'Refactoring' en el menú, elija 'Surround Con...' y, finalmente, elegir 'try..finalmente.' Su código será inmediatamente sangría y encerrado en una adecuada try..finalmente bloque.
Usted puede aprender más acerca de Castalia automatizado de refactorización instalaciones aquí.
Esta semana hemos aprendido a utilizar Delphi try..finalmente construcción para evitar pérdidas de recursos y otros problemas de control de flujo. También hemos aprendido cómo Castalia nos puede ayudar el uso de esta construcción más eficazmente con el nuevo código y el código existente. La próxima semana vamos a ver try..excepto y aprender cómo Castalia nos puede ayudar a escribir mejor código de control de excepciones.
El uso de try...finally para evitar perdidas de recursos
El uso de try...finally para evitar perdidas de recursos : Multi-millones de consejos para hacer su vida mas facil.
en Este articulo se describe Delphi a intentar..finally, cuando a utilizar, y como Castalia hace que sea mas facil de usar.
(publicado Originalmente en delphi-expert.com el 16 de Marzo de 2004)
En una linea de negocios que me ha de examinar un monton de codigo fuente, a veces noto los habitos y tendencias de los ciudadanos en el codigo. A veces estos habitos son buenos, como el uso de afirmaciones. A veces los habitos son malos, como el uso de etiquetas y gotos. A veces, el codigo es simplemente faltan algunos elementos muy importantes, ya sea por pereza o por la inadecuada comprension por parte del programador que escribio el codigo. Una de estas construcciones, que es muy potente, pero a menudo descuidado y a veces mal, es de Delphi 'intentar' construir. Durante las proximas dos semanas, vamos a mirar lo que estas construcciones hacer y como los uso, y como Castalia puede ayudarle a utilizar de manera eficaz y no de la negligencia de ellos.
Esta semana, nos vamos a concentrar en el intento..finally. La proxima semana vamos a entrar en detalle con try..excepto, incluyendo un poco de historia sobre el concepto de excepciones. Tambien vamos a hacer la diversion de java, que nos puede enseñar mucho con sus mas de-the-top excepcion mecanismo de control.
Presentacion
a Veces, usted necesita para asegurarse de que ciertas cosas se hacen para completar una tarea, independientemente de los errores que se hayan producido en la ejecucion de la tarea. Por ejemplo, si una rutina toma el control de un recurso, generalmente es necesario para la rutina para liberar el recurso, incluso si se producen errores en el proceso. Por ejemplo, en el codigo siguiente en un archivo de F es abierto, el texto esta escrito para ella, y entonces es cerrado. El no cerrar el archivo podria resultar en una perdida de recursos y seria una primera clase de error.
Reset(F)
WriteLn(F, 'Hola, Mundo!')
CloseFile(F)
Este codigo funciona bien mientras cada funcion se ejecuta normalmente, pero si algo anormal sucede, entonces no habra problemas. Por ejemplo, si Reset(F) es correcta, pero por alguna razon la llamada a WriteLn falla, la rutina de salir sin intentar a CloseFile(F). Como resultado, el archivo nunca se cierra, y un recurso que se ha filtrado.
¿Como podemos resolver este problema? WriteLn no proporciona ningun mecanismo de comprobacion de errores como algunas rutinas (mas sobre esto la proxima semana). Simplemente se ejecuta, y si algo sale mal, se plantea una excepcion (mas sobre esto la proxima semana tambien). En pocas palabras, una excepcion es una condicion anormal en la ejecucion de un programa que hace que el flujo de la interrupcion del programa. Lo que necesitamos es una manera de asegurarse de que CloseFile(F) se llama incluso si se produce una excepcion. Esto es exactamente lo que la pruebe..finally. Considerar el mismo codigo, pero protegidos con el control de flujo de un try-finally bloque:
Reset(F)
prueba
WriteLn(F, 'Hola, Mundo!')
finalmente
CloseFile(F)
fin
Ahora, nos hemos asegurado de que CloseFile(F) se llama no importa lo que suceda durante la llamada a WriteLn. Ahora, para una definicion mas formal, directamente de la ayuda de Delphi:
La sintaxis de un try..finalmente la instruccionprueba statementList1, finalmente, statementList2
donde cada uno de los statementList es una secuencia de instrucciones delimitado por punto y coma. El try..finalmente instruccion se ejecuta la instruccion en el statementList1 (prueba de la clausula). Si statementList1 acabados sin levantar excepciones, statementList2 (por ultimo clausula) es ejecutado. Si se produce una excepcion durante la ejecucion de las statementList1, el control se transfiere a la statementList2 statementList2 termine de ejecutar la excepcion es una re-subida. Si una llamada a la Salir, Break o Continuar procedimiento de control de causas para dejar statementList1, statementList2 se ejecuta automaticamente. Asi, el por ultimo clausula se ejecuta siempre, independientemente de como el prueba clausula termina.
Ahora que tenemos una comprension de la prueba..finalmente construir y cuando usarlo, veamos como Castalia puede ayudar.
Plantillas de Codigo
Castalia proporciona una serie de plantillas de codigo que implican el trato..finally. Cuando se instala por primera vez, Castalia incluye el tryf y trycf plantillas. El tryf plantilla crea un simple esqueleto de un bloque try. El uso de la tryf plantilla, simplemente escribe 'tryf' en el editor y empuje la barra espaciadora. El esqueleto de codigo se inserta:
prueba
|
finalmente
|
fin
El cursor se ubicara en el lugar adecuado en el prueba de la clausula. Despues de crear el codigo en el prueba clausula, pulse una vez para saltar a la por ultimo de la clausula. A continuacion, crear su codigo de limpieza.
el trycf de la plantilla de direcciones de un particular uso comun de la try..finalmente de la construccion en Delphi. Esta es la dinamica de creacion y destruccion de objetos. Mal ejemplo:
Mistrings := TStringList.
Mistrings.Agregar('Hola')
Mistrings.Agregar(Mundo)
Mistrings.SaveToFile('hello.txt')
Mistrings.Gratis
Esto es similar a la del primer ejemplo. Un recurso (de memoria) esta siendo asignado - en este caso por un constructor. El recurso esta siendo manipulado, entonces el resoruce se cancela la asignacion por el llamado Mistrings.Libre. Si no lo llamamos Mistrings.Libre, la memoria no se desasignan, y estariamos buscando en otra perdida de recursos. De nuevo, el problema es el mismo. Si algo va mal, mientras que la manipulacion de la memoria, el destructor nunca es llamado y la memoria nunca es desasignado. Aqui esta el codigo correspondiente:
Mistrings := TStringList.
prueba
Mistrings.Agregar('Hola')
Mistrings.Agregar(Mundo)
Mistrings.SaveToFile('hello.txt')
finalmente
Mistrings.Gratis
fin
Observe que Mistrings.Libre, ha sido trasladado a la finalmente de la clausula, asegurandose de que no importa lo que sucede en el prueba clausula, el objeto sera liberado. Castalia del trycf plantilla proporciona un esqueleto para esta construccion. El uso de la trycf plantilla, escriba 'trycf' en el editor y pulse la barra espaciadora. El esqueleto de codigo se inserta:
| := |.
prueba
|
finalmente
|.Gratis
fin
El cursor se encuentra donde el primer caracter | es, y presionando saltara a cada uno | en orden. (La | los caracteres no aparecen en el codigo, pero se utilizan con el proposito de claridad). Usted debe utilizar el trycf de la plantilla siempre se estan creando objetos de forma dinamica.
Usted puede aprender mas acerca de Castalia el codigo de las plantillas aqui.
Refactorizacion
el Codigo de las plantillas son utiles cuando estamos escribiendo en un nuevo codigo, pero no ayudan mucho cuando estamos modificando el codigo existente de conformidad con nuestra nueva comprension de try..finalmente. Castalia es refactorings va a ayudar con eso. La 'Envolvente Con...' refactorizacion permite seleccionar un bloque de codigo un try..finalmente bloque a su alrededor con solo unos clics del raton. Simplemente seleccione el codigo que va en el prueba clausula y haga clic con el boton derecho del raton. Desde el 'Refactoring' en el menu, elija 'Surround Con...' y, finalmente, elegir 'try..finalmente.' Su codigo sera inmediatamente sangria y encerrado en una adecuada try..finalmente bloque.
Usted puede aprender mas acerca de Castalia automatizado de refactorizacion instalaciones aqui.
Esta semana hemos aprendido a utilizar Delphi try..finalmente construccion para evitar perdidas de recursos y otros problemas de control de flujo. Tambien hemos aprendido como Castalia nos puede ayudar el uso de esta construccion mas eficazmente con el nuevo codigo y el codigo existente. La proxima semana vamos a ver try..excepto y aprender como Castalia nos puede ayudar a escribir mejor codigo de control de excepciones.