Powtórne zgłaszanie wyjątków


Kiedy instrukcję raise zawarto w bloku wyjątku bez identyfikatora obiektu za nim, powoduje ona zgłoszenie wyjątku, który jest obsługiwany w bloku. Pozwala to procedurze obsługi na reagowanie na wyjątek w ograniczony sposób i powtórne zgłoszenie wyjątku. Powtórne zgłoszenie jest użyteczne kiedy handler nie może w pełni obsłużyć wyjątku.

Na przykład, funkcja GetFileList alokuje obiekt TStringList i wypełnia go nazwami plików wg wyspecyfikowanej ścieżki dostępu:

function GetFileList(const Path: string): TStringList;
var
  I: Integer;
  SearchRec: TSearchRec;
begin
  Result := TStringList.Create;
  try
    I := FindFirst(Path, 0, SearchRec);
    while I = 0 do
    begin
      Result.Add(SearchRec.Name);
      I := FindNext(SearchRec);
    end;
  except
    Result.Free;
    raise;
  end;
end;

GetFileList kreuje obiekt klasy TStringList, po czym używa funkcji FindFirst i FindNext (z modułu SysUtils) wypełnienia obiektu. Jeśli operacja nie powiedzie się, z powodu np. niewłaściwej ścieżki dostępu, lub braku pamięci w liście łańcuchów — funkcja GetFileList usuwa nowo utworzony obiekt, w chwili kiedy wywołujacy funkcję jeszcze nie wie o istnieniu takiego obiektu. Z tego powodu, inicjalizacja listy łańcuchów jest przeprowadzana w instrukcji try...except. Kiedy zostanie zgłoszony wyjątek, blok wyjątku usunie kolekcję łańcuhów, poczym powtórnie zgłosi wyjątek.