Histórico de atualização: No.2
Horário de atualização: 21/10/2001 02:42
Atualizado por: Musicwind®
Nota de atualização: formato modificado.
Histórico de atualização: No.1
Horário de atualização: 19/10/2001 21:15
Atualizado por: Musicwind®
Notas de atualização: criadas.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
Prefácio: Estou imerso no Delphi há mais de três anos, mas cada vez que leio a documentação de ajuda do Delphi, ainda ganho muito, então não posso deixar de suspirar pela abrangência do Delphi! Embora me sinta envergonhado, analisarei algumas de minhas experiências e ganhos e compartilharei meu incentivo com aqueles de vocês que são tão arrogantes e menos informados quanto eu.
1. O que é uma exceção silenciosa? (Por que não O Silêncio dos Inocentes? ;-) )
Exceções silenciosas, ou seja, Slient Exceptions , referem-se ao tipo de exceção que não causa avisos de mensagens irritantes por padrão: EAbort . Em Object Pascal, a classe de exceção EAbort é a classe ancestral de todas as classes de exceção silenciosas (e EAbort herda Exception). Acionar um EAbort fará com que um módulo de execução pare até que o módulo de tratamento de exceções mais externo o intercepte, mas não fará com que uma caixa de mensagem com um sinal de parada vermelho apareça. Consulte o seguinte código:
tentar
ShowMessage('Olá1');
Raise EAbort.Create('Abortar');
ShowMessage('Olá2');
exceto
em E: Exceção fazer
showmessage('Na exceção');
fim;
O resultado da execução exibe duas caixas de mensagem, uma é "Hello1" e a outra é "On Exception". Isso mostra que o EAbort funciona, pois ignora a instrução "ShowMessage('Hello2')"; ao mesmo tempo, a caixa de mensagem "Abort it" não aparece, o que também confirma o recurso da classe de exceção EAbort de que não há caixa de diálogo. aparece. (Isso também é verdade durante o design); e a caixa de mensagem "On Exception" indica que embora EAbort possa ser uma anomalia diferente das exceções comuns, isso não nos impede de usar a antiga instrução Try-Except para capturá-la. .
2. Por que usar EAbort ?
EAbort é útil em certas situações. Por exemplo, quando precisamos encerrar uma operação, mas não queremos que os usuários percebam (não queremos que eles vejam a caixa de mensagem de exceção padrão). Claro, para obter o mesmo efeito, você também pode usar exceções comuns (por exemplo, usar o padrão de frase Try-Except, colocar o código na seção Try, gerar uma exceção se precisar encerrar a operação e não escrever qualquer código na seção Except), mas nada disso é tão simples e direto quanto usar EAbort.
3. Existe algo mais simples? --Usando o processo de abortar
Abort, um processo definido na unidade SysUtils, nos permite usar o EAbort de maneira conveniente. Veja o código fonte de implementação do Abort:
Aborto do Procedimento;
função ReturnAddr: Ponteiro;
asm
MOV EAX,[EBP + 4]
fim;
começar
aumentar EAbort.Create(SOperationAborted) em ReturnAddr;
fim;
SOperationAborted aqui geralmente é "Operação abortada".
4. Levantar o véu – princípio de implementação
Talvez você, como eu, esteja curioso para saber por que o EAbort está em silêncio. O que o Delphi fez internamente com o EAbort? Vamos descobrir juntos.
Abra um novo projeto, clique em Localizar em arquivos, insira a palavra-chave "EAbort", selecione o botão de opção Pesquisar em diretórios e defina a caixa de edição Máscara de arquivo em Opções de diretório de pesquisa para o nome do diretório onde o código-fonte do Delphi está localizado (como como o meu Sim: D:Arquivos de programasBorlandDelphi6Source) e não se esqueça de marcar Incluir subdiretório. Por fim, clique em “OK” para iniciar a pesquisa.
Como resultado, descobrimos que existem até 17 locais no código-fonte do Delphi relacionados ao EAbort. Exceto pelas duas declarações de EAbort e algumas declarações de comentários na unidade Sysutils, descobrimos que a maior parte do código é semelhante a:
se ExceptObject for EAbort então
assim como:
se não (E é EAbort) então
etc.
Todos eles têm tratamento especial para EAbort baseado em RTTI - acontece que a implementação de EAbort é simples assim!
As duas unidades que merecem atenção são: Forms (a versão Linux é QForms) e AppEvnts. É mais fácil encontrar a resposta para a pergunta no código da primeira. Veja o código fonte do Delphi:
procedimento Tapplication.HandleException(Sender: TObject);
começar
se GetCapture <> 0 então SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
se ExceptObject for exceção então
começar
se não (ExceptObject é EAbort) então
se atribuído (FOnException) então
FOnException(Remetente, Exceção(ExceptObject))
outro
ShowException(Exception(ExceptObject));
fim mais
SysUtils.ShowException(ExceptObject, ExceptAddr);
fim;
5. A diferença entre Abortar , Interromper e Sair
Abort, Break e Exit são um tanto semelhantes, mas muito diferentes. Break é usado para interromper um loop em uma instrução de loop. Exit é usado para sair do corpo da função atualmente em execução (ou corpo do processo). Abortar permite que você salte de uma ou mais camadas de código até que o código de captura de exceção o capture.
6. Personalize exceções silenciosas
Assim como declarar uma subclasse de uma classe de exceção normal, basta tornar EAbort e suas subclasses classes ancestrais:
TMyException = Classe(EAbort);
TNextException = Classe(EAbort);
etc.
Musicwind®@HangZhou.Zhejiang.China
20/10/2001
Mais artigos
[ Fim do artigo]