Co do zasady możesz przechwycić dowolny wyjątek i go obsłużyć, poza Access Violation
.
Jak to nie da się złapać Access Violation
?
Chyba że w Delphi się nie da, ale dla FPC to taki sam wyjątek jak każdy inny — klasa EAccessViolation
, komunikat Access violation
. Można go normalnie przechwycić i obsłużyć, można go też olać (zjeść) i utrzymać przepływ sterowania bez zmian. Choć zjadanie wyjątków to raczej nie jest dobry pomysł.
Jeśli czegoś nie wiem to napisz coś więcej.
A wewnątrz dll_lib_procedure jest wyjątek raise - to nie zawsze to chwyci. Access Violation to jest błąd krytyczny tego nie da się przechwycić jeżeli "punkt" sięga do pustego bloku obiektu,...
Być może w przypadku DLL jest inaczej, być może w Delphi jest inaczej niż we Free Pascalu (choć wątpię), ale wyjątek EAccessViolation
, jeśli jest generowany w przypadku pustej (nil
owanej) referencji obiektu, może być i powinien być obsługiwany w sposób standardowy. Sprawdziłem taki przykład:
var
List: TStringList = nil;
begin
try
List.Add('foo');
except
on E: Exception do
Write('"', E.ClassName, '", "', E.Message, '"');
end;
Działa to wedle oczekiwań, na wyjściu dostaję to:
"EAccessViolation", "Access violation"
Ale znów – no chyba że Delphi działa inaczej lub kod wołany z DLL działa w inny sposób od nieimportowanego (jeśli o mechanizm wyjątków chodzi). W każdym razie, dorzuć sobie jakięs logowanie, tak aby widzieć jakie wyjątki są generowane i jakie otrzymywane są w bloku try except
, tak aby się upewnić, że one faktycznie są rzucane i że (jak pisałeś) czasami nie są poprawnie obsługiwane.