Wyjątki a wątki

0

Witam

Od razu mówię, że przeszukałem formum !
No więc tak, pytanie moje dotyczy sytuacji następującej. W metodzie Execute wątku, trafia mi się wyjątek (że się nie mogę tam z czymś połączyć), generalnie mnie on nie interesuje, jak się trafi to się trafi i trudno - dlatego chcę go stłumić:

try
i := CheckMessageCount;
except
end;

Procka CheckMessageCout łączy się z serwerem pocztowym i sprawdza liczbę wiadomości. Jakoś z tych komponentów do poczty wylatuje mi wyjątek (jak ktoś źle skrzynkę skonfigurował, albo nie ma neta) - więc go próbuje stłumić. No i tutaj pojawia się problem, bo to nie powstrzymuje propagacji wyjątku = wylatuje na zewnątrz.

Pytanie czy wyjątki w wątkach trzeba jakoś specjalnie obsługiwać ? Na necie znalazłem taką podpowiedź żeby w głównym WHILE dać:

try
// właściwe operacje
except
on Exception do
Continue;
end;

Ale to tak naprawde jest to samo jak bym go stłumił - tak czy siak też nie działa.

0

Wyjątki w wątkach zachowują się tak samo, jak bez nich. try .. except .. end działa prawidłowo bez żadnego kombinowania (przed chwilą sprawdziłem). Być może po tej funkcji coś innego podnosi wyjątek.

0
Szczawik napisał(a)

Wyjątki w wątkach zachowują się tak samo, jak bez nich. try .. except .. end działa prawidłowo bez żadnego kombinowania (przed chwilą sprawdziłem). Być może po tej funkcji coś innego podnosi wyjątek.

Na bank wylatuje w try except (debugowałem - choć to nie ciekawe przy wątkach :) ).

Zastanawiam się czy coś innego nie przejmuje obsługi wyjątków w programie. Na tym Delphi'ku są poinstalowane różne rzeczy (może jest coś włączone że tak się robi - coś jak "Stop on Delphi Exception" <= to mam oczywiście wyłączone). Ale generalnie jak odpalam nie z pod Delphi to też lecą wyjątki. Jest też TAppEvent i jest obsługa OnApplicationException, ale jak ją usunę to też wylatuje, uhm ...

0
b0bik napisał(a)

Na bank wylatuje w try except (debugowałem - choć to nie ciekawe przy wątkach :) ).

No a gdzie ma niby iść na początek try ? Pokaż całą metode Execute wątku bo jeśli to co pokazałeś:

try
  i := CheckMessageCount;
except
end;

jest kodem metody Execute to po wystąpieniu wyjątku wchodzisz do sekcji except (która jest pusta) a później oczywiśćie kończy się główna procedura wątku i tym samym wątek.

0

a nie działasz przypadkiem na Indy?

0
Gość napisał(a)
b0bik napisał(a)

Na bank wylatuje w try except (debugowałem - choć to nie ciekawe przy wątkach :) ).

No a gdzie ma niby iść na początek try ? Pokaż całą metode Execute wątku bo jeśli to co pokazałeś:

try
  i := CheckMessageCount;
except
end;

jest kodem metody Execute to po wystąpieniu wyjątku wchodzisz do sekcji except (która jest pusta) a później oczywiśćie kończy się główna procedura wątku i tym samym wątek.

Uhm. Raz wątek się nie kończy bo FreeOnTerminate jest False. Dwa no właśnie pusta jest sekcja except a to dlatego że mnie ten wyjątek kompletnie nie obchodzi.
No ale proszę oto całe Execute:

  While not Terminated do
    try
      If (fEvent.WaitFor(250) = wrSignaled) then
        Begin
          If Terminated then Exit;
          fEvent.ResetEvent;
          try
          i := CheckMessageCount;
          except
          end;
          If not(Terminated) and (fMessagesCount > 0) and (i > fMessagesCount) then
            Begin
              fMessagesCount := i;
              PostMessage(Main.Handle, WM_MAIL_CHECK_THREAD_COMPLETE, fID, fMessagesCount);
            End
          else
            fMessagesCount := i;
        End;
    except
      on Exception do
        Continue;
    end;
0
Misiekd napisał(a)

a nie działasz przypadkiem na Indy?

Indy jest zainstalowane, ale w wątku nie używam. Sprawdzam pocztę używając TMail2000.

0

A pewien jesteś, w którym try...except wystąpił wyjątek?

Jacek

0
JacekH napisał(a)

A pewien jesteś, w którym try...except wystąpił wyjątek?

Jacek

A czy to ma znaczenie ? Ja chcę ten wyjątek stłumić ! Wyjątek występuje w funkcji CheckMessagesCount.

0
b0bik napisał(a)

No ale proszę oto całe Execute:

  While not Terminated do
    try
      If (fEvent.WaitFor(250) = wrSignaled) then
        Begin
          If Terminated then Exit;
          fEvent.ResetEvent;
          try
          i := CheckMessageCount;
          except
          end;
          If not(Terminated) and (fMessagesCount > 0) and (i > fMessagesCount) then
            Begin
              fMessagesCount := i;
              PostMessage(Main.Handle, WM_MAIL_CHECK_THREAD_COMPLETE, fID, fMessagesCount);
            End
          else
            fMessagesCount := i;
        End;
    except
      on Exception do
        Continue;
    end;

No i wszystko jasne. Ten kod jest po prostu źle napisany. Nie można traktować bloku try...except...end jak begin..end.

To powinno działać:

While not Terminated do begin
    try
      If (fEvent.WaitFor(250) = wrSignaled) then
        Begin
          If Terminated then Exit;
          fEvent.ResetEvent;
          try
          i := CheckMessageCount;
          except
          end;
          If not(Terminated) and (fMessagesCount > 0) and (i > fMessagesCount) then
            Begin
              fMessagesCount := i;
              PostMessage(Main.Handle, WM_MAIL_CHECK_THREAD_COMPLETE, fID, fMessagesCount);
            End
          else
            fMessagesCount := i;
        End;
    except
    end;
end;
0

Zwątpiłem w moją wiedzę na temat Delphi. A dlaczego nie można try except end traktować jako begin end ???

W każdym razie jest bez zmian. Nie chcę się kłócić bo nie czuje się ekspertem, ale wydaje mi się że można traktować try except end jako blok taki jak begin end.

To tyle na dzisiaj, uciekam do domu - oczywiścię proszę dalej o pomoc - temat otwarty.

0
Gość napisał(a)

No i wszystko jasne. Ten kod jest po prostu źle napisany. Nie można traktować bloku try...except...end jak begin..end.

Nie można to pisać takich bzdur na forum. Twoje try..except różni się tylko tym, że obejmuje większy fragment kodu co jest zupełnie bez znaczenia.

0

Kod wygląda dobrze. Podejrzewam, że masz w Delphi włączoną opcję 'Break on exceptions' czy coś takiego. Delphi domyślnie jest tak ustawione, że przerywa działanie programu, kiedy poleci wyjątek, niezależnie od tego, czy wyjątek został wyłapany czy nie. Rozwiązanie - wyłącz tę opcję lub uruchom program poza Delphi.

// A odnośnie postu o tym, że kod jest niepoprawnie napisany, bo nie można stosować try except jako begin i end, to się nieźle uśmiałem. :)

0
Krolik napisał(a)

Podejrzewam, że masz w Delphi włączoną opcję 'Break on exceptions' czy coś takiego.

Pisałem o tym w drugim poście.

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