This page was last modified 07:32, 14 July 2007.
Использование ловушки(TRAP)
From Forum Nokia Wiki
Перевод с английского, оригинальная статья находится здесь.
Исходный код который может привести к возникновению сброса, должен запускаться в рамках ловушки(TRAP). Если произойдет сброс, управление будет передано последней объявленной ловушке, при этом будет передан код сброса. Следовательно не все "сбрасываемые" функции должны вызываться в рамках TRAP а только те, которые находятся на вершине стека вызовов. Если "сбрасываемая" функция не находится на вершине стека и вызывает другую функция в которой может произойти сброс, TRAP можно не использовать.
Макросы для реализации ловушек
Всего существует три подобных макроса: TRAP, TRAPD, TRAP_IGNORE. Они отличаются только тем, как обходятся с кодом сброса. Для использования макроса TRAP Вы должны предварительно объявить целочисленную переменную в которую будет записан код ошибки:
TInt err; TRAP(err, LeavingFunctionL());
Макрос TRAPD сам объявляет переменную в которую будет записан код ошибки:
TRAPD(err, LeavingFunctionL());
Макрос TRAP_IGNORE используется в случае если код ошибки не нужен:
TRAP_IGNORE(LeavingFunctionL());
Где должны быть расположены ловушки ?
Ответ на этот вопрос можно найти здесь.
Советы и приемы использования
Не вызывайте LC-функцию в рамках ловушки
Все объекты помещенные в стек очистки внутри ловушки должны быть извлечены из стека до выхода за пределы ловушки. Иначе будет сгенерирована паника E32USER-CBase 71.
Будьте осторожны при использовании TRAPD
При каждом использовании TRAPD объявляется переменная которая будет содержать код сброса в случае его возникновения. Рассмотрим фрагмент кода:
TRAPD(err, LeavingFunctionL()); if (!err) { TRAPD(err, AnotherLeavingFunctionL()); } return err;
В результате выполнения данного кода всегда будет возвращаться код сброса функции LeavingFunctionL(), так как повторное использование макроса определит новую переменную err уже в фигурных скобках. Для корректной работы при вызове AnotherLeavingFunctionL() нужно использовать макрос TRAP потому что переменная err уже объявлена.
Оптимизированное использования ловушек
Частое использование ловушек может привести к серьезной потере производительности. Рассмотрим фрагмент кода:
TInt DoSomethingLeaveSafe() { TRAPD(err, LeavingFunctionL()); if (!err) { TRAP(err, AnotherLeavingFunctionL()); if (!err) { TRAP(err, OneMoreLeavingFunctionL()); } } return err; }
В данном случае использование трех ловушек можно свести к одной если добавить дополнительную функцию:
TInt DoSomethingLeaveSafe() { TRAPD(err, DoSomethingL()); return err; } void DoSomethingL() { LeavingFunctionL(); AnotherLeavingFunctionL(); OneMoreLeavingFunctionL(); }
Результат будет тот же, но производительность возрастет.
Дополнительные средства при организации ловушек
В файле e32cmn.h (в папке \epoc32\include) можно обнаружить три интересных макроса:
TRAP_INSTRUMENTATION_START TRAP_INSTRUMENTATION_NOLEAVE TRAP_INSTRUMENTATION_LEAVE
Эти макросы позволяют определить код, который будет выполняться во время работы ловушки:
- TRAP_INSTRUMENTATION_START - перед вызовом сбрасываемого кода
- TRAP_INSTRUMENTATION_NOLEAVE - выполняется если вызов прошел без сброса
- TRAP_INSTRUMENTATION_LEAVE - выполняется если был сброс
Для использования этих макросов Вам необходимо переопределить их, например так:
static void LogLeave(TInt aErr, const TUint8* aFile, TInt aLine); #undef TRAP_INSTRUMENTATION_LEAVE #define TRAP_INSTRUMENTATION_LEAVE(aResult) LogLeave(aResult, (TText8*)__FILE__, __LINE__)
В данном примере функция LogLeave() будет вызываться при каждом пойманном сбросе. Аргументы функции: код сброса, имя исходного файла, номер строки в исходном файле.
В результате работы данной функции может быть сформирована следующая строка:
Leave: -5, somesourcefile.cpp : 307
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Reduce Size and resolution of an Image! | Priju Jacob Paul | General Symbian C++ | 4 | 2006-11-08 15:19 |
| z | dijox | General Symbian C++ | 3 | 2003-11-26 11:35 |
| Read File | Hadad.Net | General Symbian C++ | 22 | 2007-08-26 13:22 |
| CImageEncoder not working | apsaarin | General Symbian C++ | 4 | 2004-06-15 09:11 |
| unexpected behaviour inside TRAPD | rishikum | General Symbian C++ | 4 | 2007-04-10 03:19 |
