Este artigo discute Delphi's .. finalmente tentar construir, quando usar, e como Castalia torna mais fácil de usar.

(Originalmente publicado em delphi-expert.com em 16 de março de 2004)

Em uma linha de negócio que tem me examinar um lote de código-fonte, às vezes eu aviso hábitos e tendências comuns em pessoas do código. Por vezes, estes são bons hábitos, como usar asserções. Às vezes são os maus hábitos, como o uso dos rótulos e gotos. Às vezes, o código é simplesmente faltando alguns elementos muito importantes, quer devido a preguiça ou insuficiente compreensão por parte do programador que escreveu o código. Um destes construtos que é muito poderoso, mas muitas vezes negligenciado e às vezes usurpada, a Delphi é "tentar" construir. Ao longo das próximas duas semanas, vamos olhar para o que estes constructos fazer e como utilizá-los bem e como Castalia pode ajudá-lo a usá-las de forma eficaz e não negligencie-los.

Esta semana, iremos concentrar-nos a tentar .. finalmente construir. Na próxima semana vamos entrar em detalhes com .. exceto tentam, incluindo cerca de história sobre o conceito de exceções. Também vamos fazer troça do java, quem pode ensinar-nos muito com o seu over-the-top excepção movimentação mecanismo.

Introdução

Às vezes você precisa se certificar de que certas coisas são feitas para completar uma tarefa, independentemente dos erros que possam ter ocorrido na execução da tarefa. Por exemplo, se uma rotina toma controle de um recurso, geralmente é necessário para a rotina para a liberação dos recursos, mesmo que ocorram erros no processo. Por exemplo, no seguinte código, um arquivo é aberto F, algum texto é escrito para ela e, em seguida, é fechado. Na falta de arquivar o processo resultaria em um recurso de fuga e de primeira classe seria um erro.

 
Reset (F);
WriteLn (F, 'Olá, Mundo! ");
Closefile (F);

Esse código funciona perfeitamente, desde que cada função executa normalmente, mas se algo anormal acontecer, então não haverá problemas. Por exemplo, se Reset (F) for bem sucedida, mas por algum motivo, a chamada para WriteLn falhar, irá sair da rotina, sem nunca tentar closefile (F). Como resultado, o arquivo nunca será fechado, e um recurso foi vazada.

Como vamos resolver esse problema? WriteLn não prevê qualquer mecanismo de verificação de erros como fazer algumas rotinas (mais no que na próxima semana). Ele simplesmente executa, e se algo der errado, ele levanta uma exceção (mais no que na próxima semana também). Em poucas palavras, uma exceção é uma condição anormal na execução de um programa que faz com que o fluxo do programa a ser interrompido. O que precisamos é uma maneira de ter a certeza de que closefile (F) obtém chamado, mesmo que ocorra uma exceção. Este é exatamente o que a tentar .. finalmente é para construir. Considere o mesmo código, mas com o fluxo protegido controle de um bloco try-finalmente:

 
Reset (F);
tentar
WriteLn (F, 'Olá, Mundo! ");
finalmente
Closefile (F);
fim
;

Agora, temos assegurado que closefile (F) vai ser chamado, não importa o que aconteça durante a chamada para WriteLn. Agora, para uma definição mais formal, diretamente da Delphi ajudar:

A sintaxe de uma declaração seja finalmente tentar ..

tentar final statementList1 finalmente statementList2

onde cada statementListé uma sequência de declarações delimitado por semicolons. A declaração tentar .. finalmente executa a declaração em statementList1 (experimente a cláusula). Se statementList1 termina sem levantar exceções, statementList2 (finalmente a cláusula) é executado. Se uma exceção for levantada durante a execução das statementList1, controle é transferido para statementList2; uma vez statementList2acabamentos execução, a exceção é re-levantadas. Se uma chamada para o Exit, Break, ou Continuar procedimento provoca controle de abandonar s tatementList1, statementList2 é executado automaticamente. Assim, a cláusula finalmente seja executada, independentemente da forma como a cláusula tente finaliza.

Agora que temos uma compreensão do .. finalmente tentar construir e quando usá-la, vamos olhar how Castalia pode ajudar.

Código Modelos

Castalia código prevê uma série de modelos que envolvem a tentar .. finalmente construir. Quando instalado pela primeira vez, inclui a Castalia tryf e trycf modelos. O tryfcria um modelo simples de um esqueleto tentar bloquear. Para usar o tryf modelo, basta digitar "tryf" no editor e mova a barra de espaço. Os esquelética código será inserido:

 
tentar
|
finalmente
|
final;

O cursor ficará localizada no lugar adequado na tentativa cláusula. Depois de criar o código na cláusula tente, prima uma vez para pular para o último cláusula. Em seguida, crie a sua limpeza código.

trycf os endereços um modelo particular de uso comum .. finalmente a tentar construir em Delphi. Esta dinâmica é a criação e destruição de objetos. Mau exemplo:


MyStrings: = TStringList. Crie;
MyStrings. Add ( 'Olá');
MyStrings. Add ( 'Mundo');
MyStrings.
SaveToFile ( 'hello.txt');
MyStrings. Livre;

Isto é semelhante ao primeiro exemplo. Um recurso (memória) está a ser afectado - neste caso por um construtor. O recurso está sendo manipulado, em seguida, o resoruce é deallocated pela convocação MyStrings.Free. Se nós não MyStrings.Free chamada, a memória não seria deallocated, e gostaríamos de estar a olhar para mais um recurso de fuga. Novamente, o problema é o mesmo. Se algo der errado, enquanto manipulando a memória, o destruidor nunca é chamado a memória e nunca é deallocated. Aqui está o código adequado:

 
MyStrings: = TStringList. Crie;
tentar
MyStrings. Add ( 'Olá');
MyStrings. Add ( 'Mundo'
);
MyStrings. SaveToFile ( 'hello.txt');
finalmente
MyStrings. Livre;
final;

Repare que MyStrings.Free foi deslocado para o últimocláusula, garantindo que não importa o que aconteça na tentativa cláusula, o objeto será liberada. Castalia trycf da minuta prevê um "esqueleto" para construir esta. Para usar o trycf modelo, tipo "trycf" no editor e pressione a tecla espaço. Os esquelética código será inserido:

 
|: = |. Crie;
tentar
|
finalmente
|. Livre;
final;

O cursor onde será implantada a primeira | personagem é, e pressionando saltará para cada | em ordem. (A | caracteres não serão exibidos no código, mas aqui são utilizados para fins de clareza). Você deve usar o trycfmodelo quando você está criando objetos dinamicamente.

Você pode saber mais sobre o código do Castalia modelos aqui.

Refactoring

Código modelos são úteis quando estamos a escrever código novo, mas não ajudam muito quando estamos modificando código existente de acordo com a nossa nova compreensão da finalmente tentar ... Castalia's refactorings vai ajudar com isso. O "Surround Com ..." refactoring permite que você selecione um bloco de código e tentar colocar um bloco em torno dele .. finalmente com apenas alguns cliques do mouse. Basta selecionar o código que se passa no procuramcláusula e clique nele com o botão direito do mouse. Desde o "Refactoring" menu, escolha "Surround Com ..." e, finalmente, escolher a "tentar .. finalmente". O seu código será instantaneamente recortado e incluídos em um bom .. finalmente tentar bloquear.

Você pode saber mais sobre Castalia automatizado da refactoring instalações aqui.

Esta semana nós aprendemos como usar Delphi's finalmente tentar ..construir recurso para evitar vazamentos e outros problemas de controlo de fluxo. Temos também aprenderam como Castalia pode ajudar-nos a construir esse uso mais eficaz com os dois novos códigos e código existente. Na próxima semana vamos olhar .. exceto tentam Castalia e saiba como pode nos ajudar a escrever melhor manuseio excepção código.

Average rating: