Flex/AS3 – Truques e Dicas #2 – Try, Catch & Finally

Flex/AS3 – Truques e Dicas #2 – Try, Catch & Finally

Esta é mais uma das reliqueas do as3, principalmente para dar consistencia e fiabilidade à nossa aplicação e evitar que sejam disparados erros que o utilizador final possa ver. Ou seja o objectivo do

#2 – Try, Catch & Finally


É precisamente prevenir as malditas janelas de erro (quando o utilizador têm o flash player debug) e disparar acções quando esse erro acontecer, impedindo assim uma falha na aplicação. Este uso é muito util, embora pessoalmente não o use sempre (iria expandir em muito as linhas de código da aplicação) mas uso sempre que exista uma grande possibilidade de erro, no meu exemplo a seguir verão que é muito util.

 

O que eu necessitava na minha aplicação, era que quando o utilizador fizer logout (apresentasse o ecra de login de novo) da aplicação todas os meus popup’s adicionados via PopUpManager (podem ser até 20 paineis em popup) sejam removidos. 

Como eu não queria ter a necessidade de estar a controlar individualmente se um painel está aberto ou não (poderia fazer isso atravez de um array de estados) apenas percorro todos os child’s do systemManger na minha aplicação (um popUpManager.addItem() adiciona o popUp à display list do sistemManager, como se tratasse de uma janela) e tento remove-los com o popUpManager. Claro que se a minha aplicação tiver um elemento que não tenha sido colocado pelo PopUpManager iria acontecer um erro ao tentar remover esse componente, e aí sim a necessidade deste try, catch, finally torna-se muito fiavel.

 

O seu funcionamento é bem simples, o try encarrega-se de “tentar” executar a acção, enquanto que o catch se ocupa de “captar” todos os possiveis erros que aconteçam ao executar a acção e o finally encarrega-se de executar uma acção no final de tudo, quer exista erro ou não. Este finally é opcional e quanto ao catch podemos usar quantos quisermos, para cada tipo de erro especifico ou erros em geral. Seguindo com um exemplo…

Vejam o código:
[coolcode] var pops:int=systemManager.numChildren;
var x:int=1;

while(pops > x){
try {
PopUpManager.removePopUp((systemManager.getChildAt(x) as IFlexDisplayObject));
pops=systemManager.numChildren;
}
catch(e:Error) {
trace(“Error: “+e.message);
pops=systemManager.numChildren;
x++;
}
finally {
trace(“Child encontrado : “+systemManager.getChildAt(x).name);
}
}
[/coolcode] 

Como vos disse, o finally não é necessário, mas podemos coloca-lo como mostra em cima. Aproveitei para vos fornecer este código porque é muito util, no meu caso a minha aplicação apenas trabalha com popUpWindows, que juntamente com o “stage” principal são as unicas adicionadas como childs ao systemManager, logo a display list do system manager é composta por:

[0] -> Stage

[1]-> popUpXXX0

[2]-> popUpXXX1

Por isso eu ter indicado while(systemManager.numChildren > x) onde o x=1 , visto que se indicasse com o …systemManager.getChildAt(x)  onde o x fosse 0  ele não conseguiria tratar esse child (stage) como iFlexDisplayObject (ou seja, não é um popUp) logo o PopUpManager não o iria remover mas estranhamente também não disparava qualquer erro , logo o systemManager.numChildren é sempre superior a 0  que faria com que o while fosse executado eternamente resultando num crash  do flash.

Este código apenas funciona com popUps (IFlexDisplayObject) pelo que devem ter em especial atençao a utilização do mesmo que como indiquei em cima resulta num crash do flash no caso de tentarem remover o que não devem…se existir um erro ao remover algo que não devem, ele simplesmente assume que o child que existe não pode ser removido, incrementado então o x visto que se não o fizer o ciclo será executado eternamente.

 

Este try, catch, finally é muito util principalmente para lidar com os erros, prevendo assim eventuais falhas na aplicação. O try pode ainda suportar varios tipos de catch como disse en cima, por exemplo:

[coolcode] var meuLoader:URLLoader;
try{
meuLoader= new URLLoader(new URLRequest(“meuFicheiro.txt”));
}
catch(erro:IOError) {
trace(“ERRO I/O”+erro.message);
}
catch(erro:SecurityError) {
trace(“ERRO DE SEGURANCA”+erro.message);
}
finally{
trace(‘Erros do loader tratados’);
}
[/coolcode]  

Simples não?

Espero que seja util.

Cumprimentos.


5 comments

add yours
  • Ved March 27, 2009

    Útil demais!! Como sempre, vc fuçando lá onde muitos tem medo de por a mão, ou seja, no Core!

  • […] cada tipo de erro especifico ou erros em geral. Seguindo com um exemplo… (…) Leia o resto de Flex/AS3 – Truques & Dicas #2 – Try, Catch & Finally (434 palavras)   © Mário Santos em TSW – That Should Work, 2009. | Link Permanente | Um […]

  • Hugo Duarte April 4, 2009

    Uma coisa que sempre achei estranho, já tentei mtas vezes tratar os erros no Flash, mas nunca consigo, posso usar qlq script, até mesmo esse seu, ele NUNCA cai nos catchs, no maximo vai no finally!!!
    Tem que habilitar alguma opção no flash pra ele poder tratar os erros normalmente?
    Abraços

  • Mário Santos April 6, 2009

    Hugo, normalmente funcionaria sem qualquer opção, ou pelo menos que eu saiba… têm algum exemplo pratico que tenha testado? Se tiver, coloque num post no forum do blog: http://forum.msdevstudio.com que la fica melhor postar o código e resolver o problema.

    Cumps.

  • Hugo Duarte April 6, 2009

    Obrigado pela resposta… eu vou dar uma analizada mais a fundo do pq isso nao acontece… dai depois eu posto no forum…

Leave a Comment

Post