Wyjątek SIGSEV - jak obsłużyć?

0

Witam,

w pewnej linijce kodu, rzadko, aczkolwiek czasami się zdarza (w zależności od wprowadzanych parametrów) wyskakuje wyjątek External: SIGSEV. Jak go obsłużyć? W przypadku wystąpienia tego wyjątku chciałabym wyjść z pętli, w której on wyskakuje.

try
     //linijka kodu, ktora wywoluje wyjatek  
except
   on E: Exception do
   begin
      n:=0;
      break;
   end;
   else
   begin
      n:=0;
      break;
   end; 
end;

Niestety taka implementacja na wiele się nie zdała. Wyjątek w dalszym ciągu występuje.
Jak to poprawić?

2

To nie wyjątek tylko błąd naruszenia ochrony pamięci. Należy napisać kod bez błędów i tyle.

0

Aha a jest jakiś sposób na przechwycenie tego sygnału i jego obsłużenie?

2

nie, bo to jest naruszenie pamieci. To nie jest wyjatek. To jest BLAD tak jak pisal shalom. Musisz napisac kod ktory nie narusza "nieswojej" pamieci

2

@madzieq - nie podałaś wersji Delphi; W starych wersjach (np. Delphi7) nie było czegoś takiego jak SIGSEGV, tylko Access Violation, więc musisz korzystać z jakiejś nowszej wersji;

Nie wiem jak w nowszych Delphi, ale FPC ma coś takiego jak External: SIGSEGV i to jest wyjątek (a przynajmniej błąd ten jest traktowany jako wyjątek), więc można go obsługiwać blokiem Try Except; I o ile w trybie debugowania będzie problem ze wznowieniem pracy debugowanej aplikacji (szlag trafia debuger :]), to w trybie release problemu już nie będzie - wyjątek zostanie złapany i obsłużony prawidłowo, bez systemowego okienka z komunikatem;

@madzieq - Ty i tak korzystasz z "Pokemon Exception Handling", więc Twój kod można zapisać tak:

try
  // linijka naruszająca pamięć
except
  n := 0;
end;

Nie wiem po co to Break - to nie C++ (chyba że blok wyłapujący wyjątki masz wewnątrz ciała pętli); W każdym razie jeśli używasz FPC, to poza debugerem wszystko powinno działać jak należy (tzn. prawidłowo łapać wyjątek); Nie wiem jak zachowa się Delphi, ale także powinno łapać wyjątek, a przynajmniej w trybie release;

Co i tak nie zmienia faktu, że kod należy poprawić, bo na pewno jest błędny.

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