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

Wyjątek SIGSEV - jak obsłużyć?
madzieq
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 83
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.

Kopiuj
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ć?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
2

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

madzieq
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 83
0

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

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.