Seite 1 von 1

On Error richtig Benutzen

Verfasst: 27.12.2008 17:07
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 

Verfasst: 27.12.2008 17:18
von Andesdaf
da war der Beitrag weg... :?

Verfasst: 27.12.2008 17:20
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.

Verfasst: 27.12.2008 17:29
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.

Verfasst: 27.12.2008 17:34
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.

Verfasst: 27.12.2008 17:35
von Joel
Kann man den Debugger von PB irgentwie in die Exe einbinden?

Verfasst: 27.12.2008 17:40
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.

Verfasst: 27.12.2008 17:45
von Joel
Wäre die Funktion: "Warnhinweis verwenden" unter Kompilieren und Starten auch gut?

Verfasst: 27.12.2008 21:36
von HeX0R
Joel hat geschrieben:Die die Funktion: "Warnhinweis verwenden" unter Kompilieren und Starten auch gut?
Sätze falsch Sinn wenig machen.

Verfasst: 27.12.2008 22:17
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?