On Error richtig Benutzen

Anfängerfragen zum Programmieren mit PureBasic.
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

On Error richtig Benutzen

Beitrag von kiki »

Wie benutze ich OnError richtig? Bei mir gibt er gar keine Fehler aus, ist an dem code was falsch?

Code: Alles auswählen

Procedure ErrorHandler()
 
  ErrorMessage$ = "A program error was detected:" + Chr(13) 
  ErrorMessage$ + Chr(13)
  ErrorMessage$ + "Error Message:   " + ErrorMessage()      + Chr(13)
  ErrorMessage$ + "Error Code:      " + Str(ErrorCode())    + Chr(13)  
  ErrorMessage$ + "Code Address:    " + Str(ErrorAddress()) + Chr(13)
 
  If ErrorCode() = #PB_OnError_InvalidMemory   
    ErrorMessage$ + "Target Address:  " + Str(ErrorTargetAddress()) + Chr(13)
  EndIf
 
  If ErrorLine() = -1
    ErrorMessage$ + "Sourcecode line: Enable OnError lines support to get code line information." + Chr(13)
  Else
    ErrorMessage$ + "Sourcecode line: " + Str(ErrorLine()) + Chr(13)
    ErrorMessage$ + "Sourcecode file: " + ErrorFile() + Chr(13)
  EndIf
 
  ErrorMessage$ + Chr(13)
  ErrorMessage$ + "Register content:" + Chr(13)
 
  CompilerSelect #PB_Compiler_Processor 
    CompilerCase #PB_Processor_x86
      ErrorMessage$ + "EAX = " + Str(ErrorRegister(#PB_OnError_EAX)) + Chr(13)
      ErrorMessage$ + "EBX = " + Str(ErrorRegister(#PB_OnError_EBX)) + Chr(13)
      ErrorMessage$ + "ECX = " + Str(ErrorRegister(#PB_OnError_ECX)) + Chr(13)
      ErrorMessage$ + "EDX = " + Str(ErrorRegister(#PB_OnError_EDX)) + Chr(13)
      ErrorMessage$ + "EBP = " + Str(ErrorRegister(#PB_OnError_EBP)) + Chr(13)
      ErrorMessage$ + "ESI = " + Str(ErrorRegister(#PB_OnError_ESI)) + Chr(13)
      ErrorMessage$ + "EDI = " + Str(ErrorRegister(#PB_OnError_EDI)) + Chr(13)
      ErrorMessage$ + "ESP = " + Str(ErrorRegister(#PB_OnError_ESP)) + Chr(13)
 
    CompilerCase #PB_Processor_x64
      ErrorMessage$ + "RAX = " + Str(ErrorRegister(#PB_OnError_RAX)) + Chr(13)
      ErrorMessage$ + "RBX = " + Str(ErrorRegister(#PB_OnError_RBX)) + Chr(13)
      ErrorMessage$ + "RCX = " + Str(ErrorRegister(#PB_OnError_RCX)) + Chr(13)
      ErrorMessage$ + "RDX = " + Str(ErrorRegister(#PB_OnError_RDX)) + Chr(13)
      ErrorMessage$ + "RBP = " + Str(ErrorRegister(#PB_OnError_RBP)) + Chr(13)
      ErrorMessage$ + "RSI = " + Str(ErrorRegister(#PB_OnError_RSI)) + Chr(13)
      ErrorMessage$ + "RDI = " + Str(ErrorRegister(#PB_OnError_RDI)) + Chr(13)
      ErrorMessage$ + "RSP = " + Str(ErrorRegister(#PB_OnError_RSP)) + Chr(13)
      ErrorMessage$ + "Display of registers R8-R15 skipped."         + Chr(13)
 
    CompilerCase #PB_Processor_PowerPC
      ErrorMessage$ + "r0 = " + Str(ErrorRegister(#PB_OnError_r0)) + Chr(13)
      ErrorMessage$ + "r1 = " + Str(ErrorRegister(#PB_OnError_r1)) + Chr(13)
      ErrorMessage$ + "r2 = " + Str(ErrorRegister(#PB_OnError_r2)) + Chr(13)
      ErrorMessage$ + "r3 = " + Str(ErrorRegister(#PB_OnError_r3)) + Chr(13)
      ErrorMessage$ + "r4 = " + Str(ErrorRegister(#PB_OnError_r4)) + Chr(13)
      ErrorMessage$ + "r5 = " + Str(ErrorRegister(#PB_OnError_r5)) + Chr(13)
      ErrorMessage$ + "r6 = " + Str(ErrorRegister(#PB_OnError_r6)) + Chr(13)
      ErrorMessage$ + "r7 = " + Str(ErrorRegister(#PB_OnError_r7)) + Chr(13)
      ErrorMessage$ + "Display of registers r8-R31 skipped."       + Chr(13)
 
  CompilerEndSelect
 
  MessageRequester("OnError example", ErrorMessage$)
  End
 
EndProcedure

OnErrorCall(@ErrorHandler())

ReadFile(2, "C:\b.txt")
WriteData(2, @*w, 0); Hier ist ein Fehler 
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

da war der Beitrag weg... :?
Win11 x64 | PB 6.20
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

@Andesdaf: Habe was dummes geschrieben, weil ich die Frage oben
überflogen habe :)

Deine Prozedur ist zwar richtig, kiki (ist auch aus der PB Hilfe), jedoch sind deine
angegebenen Fehler ein wenig schwer zu erkennen, da der Fehler an den
Befehlen liegt und nicht an irgendwelchen ASM fehlern.

Bei mir kommt hier eine Meldung, weil der Fehler am Code liegt und
nicht an einer falschen Anwendung einer Funktion:

Code: Alles auswählen

Y=0
X=1/Y
Dafür kannst du durch den Rückgabewert einen Fehler ermitteln und den
durch RaiseError ausgeben.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Kann ich die Fehler, die Pb ausgibt auch ausgeben, nur ohne, dass der jenige PB Installieren muss. Also OnError der Alle Fehler ausgibt, nicht nur die ASM barsierten.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

Man kann nur die Fehler in seinem eigenen Programm, dass mit PB
geschrieben wurde, durch RaiseError(Code) ausgeben.

Hier ein Beispiel mit ReadFile:

Code: Alles auswählen

If ReadFile(0,"...")
  blabla read
  ...
Else
  RaiseError(#MyErrorCode_ReadFile)
EndIf
Den Error-Code kann man dann logischer weise
durch "GetErrorCode()" im ErrorHandler ermitteln
Man muss also die Arbeit selbst machen.

Ich hoffe ich habe dich richtig verstanden.
Zuletzt geändert von Josef Sniatecki am 27.12.2008 17:35, insgesamt 1-mal geändert.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Kann man den Debugger von PB irgentwie in die Exe einbinden?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

Ja das geht. Ist zwar unprofessionell, aber es ist durch eine Konsole
im Hintergrund möglich.

Stelle einfach in der Kompiler-Einstellungen "Kompiler/Starten" die
Checkbox "Temporäres Executable" auf ein. Nach dem kompilieren wirst
du im Ordner, in dem dein Quellcode ist, die Exe mit dem Debugger im
Hintergrund haben.

Aber trotzdem würde ich dir die manuelle Möglichkeit raten.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Wäre die Funktion: "Warnhinweis verwenden" unter Kompilieren und Starten auch gut?
Zuletzt geändert von Joel am 27.12.2008 22:16, insgesamt 1-mal geändert.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Joel hat geschrieben:Die die Funktion: "Warnhinweis verwenden" unter Kompilieren und Starten auch gut?
Sätze falsch Sinn wenig machen.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Das ist der Nachteil, wenn man an einem 12-Zoll Netbook arbeitet.

Also der Satz sollte heißen: Wäre die Funktion: "Warnhinweis verwenden" unter Kompilieren und Starten auch gut?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Antworten