Ja, Ausnahmefehler. Zum Beispiel Division durch NullFalko hat geschrieben:Ausnahmefehler?
oder Illegale Speicherzugriffe (IMA).
Diese Seiten mit Fehlernummern, die Du hier zeigst,
sind Fehlernummer der WinAPI-Funktion GetLastError_().
Das hat aber beides nichts mit einander zu tun.
OnError fängt Programmabstürze ab. Bei einem illegalen
Speicherzugriff (z.B. Null-Zeiger), kannst Du das nun
abfangen und mit den OnError-Funktionen herausfinden
wo der Fehler stattfand, welche Werte die Register zu dieser
Zeit hatten usw.
Anders bei der WinAPI-Funktion GetLastError_(). Diese
fängt keine Abstürze oder sonstwas ab. Mit dieser Funktion
bekommt man eine genaue Fehlerbeschreibung für den
letzten WinAPI-Fehler.
Beispielsweise die Funktion MoveFile_(ExistingFileName$, NewFileName$):
Wenn die Funktion korrekt ausgeführt wurde, gibt sie einen Wert
ungleich 0 zurück, also True/Wahr (nicht zu verwechseln mit #True).
Konnte die Funktion jedoch nicht richtig ausgeführt werden, gibt
die Funktion 0 zurück. So weiß man das die Funktion fehlgeschlagen ist,
aber kennt nicht den Grund dafür. War das Ziel schreibgeschützt oder
hat man dort keine Berechtigung, existiert die Datei oder das Verzeichniss
garnicht uvm.
Man braucht also eine Möglichkeit um an die genaue Ursache für den
Fehler zu kommen, und genau das macht GetLastError_().
GetLastError_() gibt die Nummer des zuletzt aufgetretenen WinAPI-
Fehlers zurück. Diese Nummer kann man dann in den von Dir gezeigten
Listen nachschlagen - oder man benutzt FormatMessage_() mit dem
Flag #FORMAT_MESSAGE_FROM_SYSTEM um den Fehlercode von
GetLastError_() in einen lesbaren String umzuwandeln.
OnError hat also absolut nichts damit zu tun. Wenn eine WinAPI oder
auch PB-Funktion nicht ausgeführt werden kann, dann crasht sie doch
(normalerweise
sondern gibt meist 0 zurück. Mit OnError passiert da garnichts.
Mit OnError kann man eigene Ausnahmefehler mit RaiseError werfen (nur Windows).
Code: Alles auswählen
Procedure ErrorHandler()
Select ErrorCode()
Case 1 : Error$ = "Fehler 1"
Case 2 : Error$ = "Fehler 2"
Case #PB_OnError_DivideByZero
: Error$ = "Division durch 0."
Default: Error$ = "Unbekannter Fehler"
EndSelect
MessageRequester("ERROR", "The following error happened: " + Error$)
EndProcedure
OnErrorCall(@ErrorHandler())
RaiseError(2)
x = 12
y = 0
z = x / ynicht von den #PB_OnError_* Konstanten abgedeckt ist, siehe Hilfe
für ErrorCode(). Diese wenigen Konstanten haben alle sehr hohe Werte,
so daß man imo ruhig bei 1 mit eigenen Fehlercodes anfangen kann.
Ein Hinweis dazu in der Hilfe, welche Nummern man selbst sicher benutzen
darf, wäre aber sicherlich gut.
