Zagnieżdżone wyjątki


Kod wykonywany w procedurze obsługi wyjątku może zgłaszać i obsługiwać sam siebie (instrukcją raise). Tak długo jak takie wyjątki są obsługiwane w obrębie procedury obsługi, nie wywierają wpływu na oryginalny wyjątek. Jednak, kiedy wyjątek zgłoszony w procedurze obsługi wyjątku przekazuje kontrolę poza tę procedurę, oryginalny wyjątek jest tracony. Ilustruje to funkcja Tan poniżej:

type ETrigError = class(EMathError);

function Tan(X: Extended): Extended;
begin
  try
    Result := Sin(X) / Cos(X);
  except
    on EMathError do
      raise ETrigError.Create('Nieprawidłowy argument funkcji Tan!');
  end;
end;

Jeśli wyjątek EMathError zdarza się podczas wykonywania funkcji Tan, blok obsługi wyjątku zgłasza wyjątek ETrigError. Ponieważ Tan nie dostarcza obsługi wyjątku ETrigError, kontrola przekazywana jest poza oryginalną procedurę obsługi wyjątklu, powodując zniszczenie wyjątku EMathError. Z punktu widzenia wywołującego, wygląda to, jak gdyby funkcja Tan zgłaszała wyjątek ETrigError.