TryCatch - PBOSL Example
Verfasst: 25.02.2006 23:02
Da ich ziemlich überzeugt davon bin, dass TryCatch eine bessere Übersicht
erlaubt und einige Fehler weniger hat als OnError von PB, erlaube ich mir
hier ein wenig Werbung mit einem Beispiel zu machen.
Was macht hier z. B. die OnErrorLib? :
Nicht wirklich schön, oder? Falsche Variablenwerte (Esp nicht gesichert),
jede Menge Fehlermeldungen und das Programmende wird trotzdem nicht
ausgeführt, d. h. der letzte MessageRequester() wird nicht gezeigt...
PBOSL Variante:
Sauberes Programmende! Natürlich will ich nicht sagen, OnError sei total
unbrauchbar, immerhin liefert es einige Informationen mehr über den
Fehler! Trotzdem ist man mit TryCatch näher am Fehler dran und kann
deshalb gut darauf reagieren.
Hier nun eine noch schöner anwendbare Variante mit Makros:
Benötigt PBOSL und PB > 4.0
greetz
Remi
erlaubt und einige Fehler weniger hat als OnError von PB, erlaube ich mir
hier ein wenig Werbung mit einem Beispiel zu machen.
Was macht hier z. B. die OnErrorLib? :
Code: Alles auswählen
; Debugger ausschalten!!!
Procedure doof(a.l, b.l)
; Prozedur mit lokalen Variablen/Parametern
OnErrorGoto(?error)
CopyMemory(a, b, 50)
MessageRequester("Ging", "Lief?")
error:
ClearError()
MessageRequester("Werte der Variablen", "a:" + Str(a) + " b:" + Str(b))
ProcedureReturn
EndProcedure
doof(1, 1)
MessageRequester("Ende", "ProgrammEnde")
jede Menge Fehlermeldungen und das Programmende wird trotzdem nicht
ausgeführt, d. h. der letzte MessageRequester() wird nicht gezeigt...
PBOSL Variante:
Code: Alles auswählen
; Arbeitet sogar mit Debugger zusammen, d. h. der Exception-Handler
; vom Debugger wird überschrieben (und wiederhergestellt)
Procedure doof(a.l, b.l)
; Prozedur mit lokalen Variablen/Parametern
If TryError()
CopyMemory(a, b, 50)
MessageRequester("Ging", "Lief?")
Else
MessageRequester("Werte der Variablen", "a:" + Str(a) + " b:" + Str(b))
EndIf : EndTryError()
ProcedureReturn
EndProcedure
doof(1, 1)
MessageRequester("Ende", "ProgrammEnde")
unbrauchbar, immerhin liefert es einige Informationen mehr über den
Fehler! Trotzdem ist man mit TryCatch näher am Fehler dran und kann
deshalb gut darauf reagieren.
Hier nun eine noch schöner anwendbare Variante mit Makros:
Benötigt PBOSL und PB > 4.0
Code: Alles auswählen
Macro Try
If TryError()
EndMacro
Macro Catch
ElseIf GetTryErrorCode() =
EndMacro
Macro CatchM(e1, e2=0, e3=0, e4=0, e5=0, e6=0, e7=0)
ElseIf GetTryErrorCode() = e1 Or GetTryErrorCode() = e2 Or GetTryErrorCode() = e3 Or GetTryErrorCode() = e4 Or GetTryErrorCode() = e5 Or GetTryErrorCode() = e6 Or GetTryErrorCode() = e7
EndMacro
Macro CatchAll
Else
EndMacro
Macro EndTry
EndIf:EndTryError()
EndMacro
; Mögliche Exceptions:
; #EXCEPTION_ACCESS_VIOLATION
; #EXCEPTION_ARRAY_BOUNDS_EXCEEDED
; #EXCEPTION_BREAKPOINT
; #EXCEPTION_DATATYPE_MISALIGNMENT
; #EXCEPTION_FLT_DENORMAL_OPERAND
; #EXCEPTION_FLT_DIVIDE_BY_ZERO
; #EXCEPTION_FLT_INEXACT_RESULT
; #EXCEPTION_FLT_INVALID_OPERATION
; #EXCEPTION_FLT_OVERFLOW
; #EXCEPTION_FLT_STACK_CHECK
; #EXCEPTION_FLT_UNDERFLOW
; #EXCEPTION_ILLEGAL_INSTRUCTION = $C000001D
; #EXCEPTION_IN_PAGE_ERROR
; #EXCEPTION_INT_DIVIDE_BY_ZERO
; #EXCEPTION_INT_OVERFLOW
; #EXCEPTION_INVALID_DISPOSITION = $C0000026
; #EXCEPTION_NONCONTINUABLE_EXCEPTION = $C0000025
; #EXCEPTION_PRIV_INSTRUCTION
; #EXCEPTION_SINGLE_STEP
; #EXCEPTION_STACK_OVERFLOW = $C00000FD
DisableDebugger
Procedure doof()
doof()
EndProcedure
Try
; Jede Menge Fehler ->
; einen nach dem anderen auskommentieren
!INT 4
!INT 3
a = a / 0
doof()
!HLT
Catch #EXCEPTION_ACCESS_VIOLATION
MessageRequester("Fehler", "Access Violation!")
Catch #EXCEPTION_INT_DIVIDE_BY_ZERO
MessageRequester("Fehler", "Division by 0!")
CatchM(#EXCEPTION_BREAKPOINT, #EXCEPTION_INT_OVERFLOW)
MessageRequester("Fehler", "Breakpoint or IntOverflow!")
CatchAll
MessageRequester("Fehler", "Fehler: " + Hex(GetTryErrorCode()))
EndTry
greetz
Remi