This page was last modified 02:59, 21 December 2007.
Capturando abandonos com TRAP
From Forum Nokia Wiki
TRAPS são utilizadas pela aplicação para capturar abandonos. Elas podem ser comparadas ao mecanismo Try/Catch de C++. Quando uma função lança um abandono , o fluxo de execução da aplicação é desviado para a TRAP mais recente.
Uma função lança um abandono fazendo uma chamada à função User::LeaveIfXXX() , esta função é análoga à um throws em C++. Esta função passará para a TRAP o código de abandono lançado, com este código o programador pode tomar ações para manter a aplicação em um estado estável ou finalizá-la.
Nota: O funcionamento das TRAPS e do User::LeaveIfXXX() podem ser análogas as funções setjmp() e longjmp() respectivamente. setjmp() salva o contexto da função (valores dos registradores, etc) e longjmp() repassa o fluxo do programa para o ambiente salvo pelo último setjmp().
Existem duas funções para capturar abandonos, TRAP e TRAPD , ambas funcionam de forma semelhante, a única diferença está na forma como a variável que recebe o código de erro é declarada. Na TRAP a variável precisa ser declarada antes da sua utilização enquanto na TRAPD ela é declarada durante a sua execução. É importante notar que no caso da TRAPD a variável existe apenas dentro do escopo onde a TRAPD se encontra.
Definição de TRAP e TRAPD
TRAP(_r, _s)
TRAPD(_r, _s)
Esta função executa um conjunto de instruções C++ e retorna um inteiro com o valor do abandono (caso tenha ocorrido).
Onde:
_r = Inteiro que irá receber o código do abandono (valores negativos) ou KErrNone ( 0 ) caso a execução seja executada com sucesso.
_s = Conjunto de instruções C++ que possam gerar um abandono, é possível especificar mais de uma separando-as por vírgula apesar de não ser muito aconselhado para manter o código legível.
Nota: A varíavel criada por TRAPD Dexiste apenas dentro do escopo no qual ele está inserido por isso deve-se ter cautela quando for utilizar este valor para retorno. Por exemplo:
TRAPD(err, FuncaoQuePodeAbandonar()); if( err == KErrNone ) { TRAPD(err, OutraFuncaoQuePodeAbandonar()); if( err == KErrNone) { // faz algo } } return err;
Neste caso o valor de err não será como o previsto pelo programador, ele será o valor retornado pela TRAPD de FuncaoQuePodeAbandonar() já que o valor de err da TRAPD OutraFuncaoQuePodeAbandonar() só existe no escopo do primeiro if.
Exemplos de como utilizar TRAP e TRAPD
TInt err; TRAP(err, FuncaoQuePodeAbandonarL()); if( err == KErrNone ) // não ocorreu abandono { // faz algo } else // Ocorreu abandono { // faz algo }
Exemplo com TRAPD:
TRAPD(err, FuncaoQuePodeAbandonarL()); if( err == KErrorNone ) { // faz algo } else { // faz algo }
Nota 1: A utilização de TRAPS vem a um custo alto, ocorre um aumento no tamanho do binário da aplicação e na sua velocidade de execução. Para garantir o funcionamento das TRAPS, o sistema aloca uma estrutura para guardar os dados da pilha onde a TRAP se encontra, esta estrutura será utilizada para restaurar o contexto caso a função que está sendo testada na TRAP abandone.
Referências
SymbianOS Explained : Effective C++ Programming for SmartPhones. Stichbury, Jo. John Wiley & Sons. 2005.
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Reading text file by lines | stenlik | General Symbian C++ | 1 | 2004-06-30 05:28 |
| Exit type 2,71,E32USER-CBase | gemilib | General Symbian C++ | 3 | 2007-10-31 08:58 |
| CMsvSession::OpenAsyncL panics with kern-exec 3 exception during LowMem test | raulftang | General Symbian C++ | 11 | 2007-02-19 07:19 |
| CEcmtServer error on startup | Neverhouse | General Symbian C++ | 3 | 2008-07-03 21:24 |
| MIF file SVG icon count | spietari | Symbian Media (Graphics & Sounds) | 1 | 2007-01-19 06:48 |
