On Error ...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: On Error ...

Beitrag von Danilo »

Falko hat geschrieben:Ausnahmefehler?
Ja, Ausnahmefehler. Zum Beispiel Division durch Null
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 ;)) nicht einfach und beendet das Programm somit,
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 / y
Als eigene Nummer für RaiseError() würde ich alles betrachten was
nicht 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: On Error ...

Beitrag von Falko »

Hallo Danilo,
... Ausnahmefehler? ...

Das bezog sich nur auf die Fragestellung von edel und meine Antwort vorher auf
dieses hier. Vielleicht war meine Fragestellung missverständlich ausgedrückt.

Daffy0815 hat geschrieben:Ja, das wurde schon richtig verstanden!

Es geht mir darum eine eigene Fehlerbehandlungsroutine einzusparen.

Beispielsweise wenn es zu Übertragungsfehlern zu einem externen Subsystem kommt.

Wäre natürlich schon hilfreich zu wissen ob es irgendwo im MSDN ein Verzeichnis der möglichen Errorcodes gibt.

Gruß

Daffy

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: On Error ...

Beitrag von Danilo »

Falko hat geschrieben:Hallo Danilo,
... Ausnahmefehler? ...

Das bezog sich nur auf die Fragestellung von edel
edels Frage:

Code: Alles auswählen

Was haben denn Ausnahmefehler mit den Windows Error Codes zu tun?
hatte ich mir auch schon gestellt, da es (für uns) so aussieht, als ob
Ihr hier beides durcheinander bringt. Deshalb meine Erklärung.

Wir verstehen also nicht ganz, warum Ihr die Fehlercodes für GetLastError_()
hier zeigt, wenn diese mit dem OnError-Zeug des original Fragestellers
nichts zu tun haben.
Wird wohl zu hoch für uns sein. "For advanced programmers.", wie es immer
in der Hilfe steht (z.B. bei allen Peek/Poke Funktionen). :D
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten