Przeskok z try do finally

0

Cześć, mam niezłą zagwozdkę i nie potrafię sobie z nią poradzić. Chyba nie obejdzie się bez użycia goto.

Mam kod w bloku: try..finally
Jeśli w środku zajdą określone warunki, program ma przeskoczyć do finally:

try
  //jakiś kod
  if (warunek) and (warunek2) then
  begin
    //jakiś kod
    Abort;
  end;

//jakiś kod
finally
  //jakiś kod
end;

Problem polega na tym, że Abort zachowuje się dość dziwnie. Teoretycznie wskakuje mi do finally, ale potem dzieją się jakieś dziwne rzeczy. Finally jakby nie przechwytywało tego wyjątku. Bo potem nie wykonuje się kod, który powinien.

Da się to zrobić jakoś bez goto i tworzenia kolejnych funkcji?

[dopisane]
Właśnie się okazało, że nie można użyć w tym wypadku goto - kompilator nie pozwala.

0

Co widzisz w debugerze? Wchodzi do tego finally?

0
AdamPL napisał(a)

Co widzisz w debugerze? Wchodzi do tego finally?

Tłumaczę dokładnie.

W programie używam TCoolTrayIcon.

I teraz tak, mam następujące wywołanie, np. pod przyciskiem:

//kawalek kodu
  MojaFunkcjaZBlokiemTryFinally;
//inny kod

Kod w finally jest wykonywany, a potem debugger przeskakuje gdzieś do klas TCoolTrayIcon, zamiast normalnie zakończyć funkcję i wykonać //inny kod

[dopisane]
Zamiast Abort, użyłem EXIT. I to zadziałało. Ale wcześniej też tak robiłem i dostawałem błąd Privileged instruction. Ktoś potrafi to wytłumaczyć?

0

Jak ma wchodzić do obsługi wyjątku tylko po abort to powinieneś dać try... except , bo przecież kod w finally będzie się wykonywał zawsze czy będzie abort czy nie. IMHO ort! coś źle w finally jeżeli się nie wykonuje.

Zamiast Abort, użyłem EXIT. I to zadziałało. Ale wcześniej też tak robiłem i dostawałem błąd Privileged instruction. Ktoś potrafi to wytłumaczyć?
Różnica jest taka, że jak dasz abort to wywołuje wyjątek i powinno się tego używać w try... except. Natomiast exit kończy wykonywanie bez wyjątku. Finally powinien się zawsze wykonać bez względu na to czy wystąpił wyjątek. Prawdopodobnie dlatego Ci gdzieś przeskakiwał bo próbował obsłużyć ten wyjątek z abort.

0

A takie coś działa?

try
  try
    if (warunek) and (warunek2) then
    begin
      //jakiś kod
      Abort;
    end;
  except
    On E:EAbort do {tu wstaw nic nie robienie ;P}
  end;
finally
//jakiś kod
end;
0

A zwykłe "Exit" nie wystarczy?
Abort - to 'cichy" wyjątek.

0

Czy ktoś jeszcze by chciał coś dodać nowego czy będziecie powtarzać to co już zostało powiedziane i do czego doszedł autor wątku?

1 użytkowników online, w tym zalogowanych: 0, gości: 1