Pokrótce mówiąc, mechanizm Leave służy do wychodzenia z funkcji, natomiast TRAP oraz TRAPD do przechwytywania tych wyjść, przy czym używanie przechwytywania nie jest zalecane ze względu na ich szybkość (a raczej nie-szybkość) działania oraz pamięciożerność.
TRAP(D)
Proste wyjaśnienie różnic pomiędzy TRAP oraz TRAPD – ten drugi zajmuje się od razu deklaracją zmiennej; przykład użycia TRAPD:
TRAPD(err, funkcjaL());
oraz przykład użycia TRAP
TInt err;
TRAP(err, funkcjaL());
Jak widać, w przypadku wersji TRAPD kod skraca się o jedną linijkę. Warto tutaj zauważyć, iż w przypadku gdy nie zastosujemy żadnego przechwycenia w programie, system zrobi to za nas.
Leave
Od razu przedstawiam kilka możliwych wersji tej funkcji:
- User::Leave()
- Wyjście z funkcji
- User::Leave(kodBłędu)
- Wyjście z funkcji z kodem błędu (jest przekazywany do TRAP(D))
- User::LeaveIfError(kodBłędu)
- Wyjście z funkcji tylko w przypadku gdy kodBłędu jest negatywny (mniejszy od 0, wszystkie błędy są wartościami ujemnymi)
- User::LeaveNoMemory()
- Odpowiednik User::Leave(KErrNoMemory)
- User::LeaveIfNull(wskaźnik)
- Wychodzi z funkcji z KErrNoMemory jeśli przekazany wskaźnik jest NULL
Bardzo ładnie zostało wyjaśnione to na polskim forum Symbiana, a dokładniej w poście użytkownika Pinio (do czego odsyłam, gdyż nie ma sensu dublować czegoś, co już zostało napisane).