Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

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
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX