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).