Seite 1 von 3

OnError-Include [PB4.x]

Verfasst: 17.02.2006 16:14
von HeX0R
Da ich die Beispiele für OnError nicht wirklich brauchbar finde, hab ich mal ne Include zusammengestellt, die sich quasi das beste aus den Beispielen rauspickt.

Dank der neuen Define-Compiler-Directiven kann man das Teil auch sehr komfortabel gestalten.

Wann immer ihr nen Fehler inner Exe sucht, pappt ihr das Teil einfach an den Anfang eures Source-Codes, oder macht ne Include draus und compiliert das ganze.
(Nur noch die OnError unterstützung aktivieren... wieso gibts dafür eigentlich noch keinen Compiler-Schalter ? Oder weiss ich nur nix davon...)

Viel Spass

[Edit]
12.12.2008 Nun auch mit PB4.3 nutzbar.
13.12.2008 Continue-Button bei PB4.3 entfernt
08.12.2020 DPI Awareness hinzugefügt
09.12.2020 Auf MessageRequester umgebaut.

Code: Alles auswählen

;+------------------------------------------------------
;|
;| OnError Include for PB >=4.0
;|
;| Usage:
;| Define the following Constants in your main program:
;|
;| #APP_NAME        = "Name of your Application"
;| #APP_VERSION     = "1.0"
;| #APP_AUTOR       = "Name of Autor"
;| #APP_AUTOR_EMAIL = "email_of_autor@mail.com"
;|
;| #USE_ON_ERROR    = #True  -> OnError will be used
;|                  = #False -> OnError won't be used
;|
;| Alternative:
;| Fill the DEFAULT-Constants with your normal Values
;|
;| Copy/Paste this to the top of your application
;| (or create an includefile)
;|
;| Have Fun
;| HeX0R
;|
;+-------------------------------------------------------

;
;-Default Values
; (will be used if nothing is set in main application)
;{
#APP_NAME_DEFAULT        = "Unknown Application"
#APP_VERSION_DEFAULT     = "0.1"
#APP_AUTOR_DEFAULT       = "Unknown Autor"
#APP_AUTOR_EMAIL_DEFAULT = "max.mustermann@web.de"
#USE_ON_ERROR_DEFAULT    = #True
;}

CompilerIf Defined(USE_ON_ERROR, #PB_Constant) = 0
	#USE_ON_ERROR = #USE_ON_ERROR_DEFAULT
CompilerEndIf

;
;-OnError Routine
;
CompilerIf #USE_ON_ERROR
	;{
	CompilerIf #PB_Compiler_LineNumbering = 0
		CompilerError "Please enable the OnError compiler option!"
	CompilerEndIf
	CompilerIf #PB_Compiler_Debugger
		CompilerError "Please disable Debugger, while OnError is activated!"
	CompilerEndIf
	
	CompilerIf Defined(APP_NAME, #PB_Constant) = 0
		#APP_NAME = #APP_NAME_DEFAULT
	CompilerEndIf
	
	CompilerIf Defined(APP_VERSION, #PB_Constant) = 0
		#APP_VERSION = #APP_VERSION_DEFAULT
	CompilerEndIf
	
	CompilerIf Defined(APP_AUTOR, #PB_Constant) = 0
		#APP_AUTOR = #APP_AUTOR_DEFAULT
	CompilerEndIf
	
	CompilerIf Defined(APP_AUTOR_EMAIL, #PB_Constant) = 0
		#APP_AUTOR_EMAIL = #APP_AUTOR_EMAIL_DEFAULT
	CompilerEndIf
	
	Procedure ErrorDialog()
		
		Protected ExeFileName.s, MessageBody.s, ErrorHWND.l, A.l, B.l, C.l, Mail.s, dx.f, dy.f
		
		CompilerIf #PB_Compiler_Version < 430
			;-Parse Body-Message
			MessageBody = "0x" + Hex(GetErrorNumber()) + #CRLF$ + #TAB$ + GetErrorDescription() + #CRLF$
			MessageBody + #CRLF$
			MessageBody + "Line:" + #TAB$ + Str(GetErrorLineNR()) + #CRLF$
			MessageBody + "Modul:" + #TAB$ + GetErrorModuleName() + #CRLF$
			Mail = GetErrorDLL()
			If Mail
				MessageBody + "Dll-Error:" + #TAB$ + Mail + #CRLF$
			EndIf
			MessageBody + #CRLF$
			MessageBody + "EIP"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorAddress())                   + #CRLF$
			MessageBody + "EAX"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_EAX))   + #CRLF$
			MessageBody + "EBX"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_EBX))   + #CRLF$
			MessageBody + "ECX"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_ECX))   + #CRLF$
			MessageBody + "EDX"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_EDX))   + #CRLF$
			MessageBody + "EBP"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_EBP))   + #CRLF$
			MessageBody + "EDI"    + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_EDI))   + #CRLF$
			MessageBody + "SegCS"  + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_SegCS)) + #CRLF$
			MessageBody + "FFlags" + #TAB$ + "=" + #TAB$ + "0x" + Hex(GetErrorRegister(#PB_OnError_FFLags))
		CompilerElse
			;-Parse Body-Message
			MessageBody + "Error Message:   " + ErrorMessage()      + #CRLF$
			MessageBody + "Error Code:      " + Str(ErrorCode())    + #CRLF$
			MessageBody + "Code Address:    " + Str(ErrorAddress()) + #CRLF$
			
			If ErrorCode() = #PB_OnError_InvalidMemory
				MessageBody + "Target Address:  " + Str(ErrorTargetAddress()) + #CRLF$
			EndIf
			
			If ErrorLine() = -1
				MessageBody + "Sourcecode line: Enable OnError lines support to get code line information." + #CRLF$
			Else
				MessageBody + "Sourcecode line: " + Str(ErrorLine()) + #CRLF$
				MessageBody + "Sourcecode file: " + ErrorFile() + #CRLF$
			EndIf
			
			MessageBody + #CRLF$
			MessageBody + "Register content:" + #CRLF$
			CompilerSelect #PB_Compiler_Processor
				CompilerCase #PB_Processor_x86
					MessageBody + "EAX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_EAX)) + #CRLF$
					MessageBody + "EBX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_EBX)) + #CRLF$
					MessageBody + "ECX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_ECX)) + #CRLF$
					MessageBody + "EDX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_EDX)) + #CRLF$
					MessageBody + "EBP" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_EBP)) + #CRLF$
					MessageBody + "ESI" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_ESI)) + #CRLF$
					MessageBody + "EDI" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_EDI)) + #CRLF$
					MessageBody + "ESP" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_ESP)) + #CRLF$
					
				CompilerCase #PB_Processor_x64
					MessageBody + "RAX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RAX)) + #CRLF$
					MessageBody + "RBX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RBX)) + #CRLF$
					MessageBody + "RCX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RCX)) + #CRLF$
					MessageBody + "RDX" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RDX)) + #CRLF$
					MessageBody + "RBP" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RBP)) + #CRLF$
					MessageBody + "RSI" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RSI)) + #CRLF$
					MessageBody + "RDI" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RDI)) + #CRLF$
					MessageBody + "RSP" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_RSP)) + #CRLF$
					MessageBody + "Display of registers R8-R15 skipped."                                   + #CRLF$
					
				CompilerCase #PB_Processor_PowerPC
					MessageBody + "r0" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r0)) + #CRLF$
					MessageBody + "r1" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r1)) + #CRLF$
					MessageBody + "r2" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r2)) + #CRLF$
					MessageBody + "r3" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r3)) + #CRLF$
					MessageBody + "r4" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r4)) + #CRLF$
					MessageBody + "r5" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r5)) + #CRLF$
					MessageBody + "r6" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r6)) + #CRLF$
					MessageBody + "r7" + #TAB$ + "=" + #TAB$ + "0x" + Hex(ErrorRegister(#PB_OnError_r7)) + #CRLF$
					MessageBody + "Display of registers r8-R31 skipped."                                 + #CRLF$
					
			CompilerEndSelect
		CompilerEndIf
		
		;-Parse Mail-Message
		Mail = "mailto:" + #APP_AUTOR_EMAIL
		Mail + "?subject=Error Description&body="
		Mail + "Hi " + #APP_AUTOR + ",%0A"
		Mail + "i discovered an Error with " + #APP_NAME + " V " + #APP_VERSION + " :%0A"
		Mail + RemoveString(ReplaceString(MessageBody, #CRLF$, "%0A"), #TAB$)
		
		MessageBody + #CRLF$ + #CRLF$ + "Do you want to send this by mail to the author?"
		If MessageRequester(#APP_NAME + " V" + #APP_VERSION + " [Runtime-Error]", MessageBody, #PB_MessageRequester_YesNoCancel | #PB_MessageRequester_Error) = #PB_MessageRequester_Yes
			RunProgram(Mail)
		EndIf
		ProcedureReturn 0
		
	EndProcedure
	
	;
	;-Call to OnError
	;
	CompilerIf #PB_Compiler_Version < 430
		OnErrorGosub(@ErrorDialog())
	CompilerElse
		OnErrorCall(@ErrorDialog())
	CompilerEndIf
	
	;}
CompilerEndIf

;Example
;F = A / B

Verfasst: 23.07.2007 21:22
von ts-soft
Warum hab ich die Übersehen?

:allright:

Verfasst: 25.07.2007 14:56
von DataMiner
:mrgreen: Klasse ! :allright:

Verfasst: 25.07.2007 15:31
von helpy
Ich hab den obigen Code mit der Division durch Null (auskommentieren der letzten Zeile des Beispiel-Codes) getestet.

Woher kommt der DLL-Fehler:
Dll-Error: Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden.
Wenn man vorher jedoch ClearError() (z.B.: innerhalb der Abfrage "CompilerIf #USE_ON_ERROR ..... CompilerEndIf") enfügt, dann kommt dieser DLL-Fehler nicht!

cu, helpy

Verfasst: 12.12.2008 21:50
von HeX0R
Hab jetzt erst gemerkt, dass sich nahezu alle Befehle der OnError-Lib mit der PB-Version 4.3 geändert haben.

Hab die Include daher angepasst und zwar so, dass sie auch noch unter älteren Versionen lauffähig bleibt.

Sieht nun etwas chaotisch aus, vor lauter Compiler-Direktiven, aber is ja wurscht, Funktion ist ja bekanntlich alles. ;)

Verfasst: 13.12.2008 02:05
von nicolaus
Schönes sache doch kannst du ab PB 4.30 dummer und unverständlicher weise das Programm nicht weiter ausführen wenns einen Erroro gegeben hat und somit kannste in deinem Beispiel den Continue Button löschen.

Is mal wieder eins von Freds sinnlosen undingern das bei jedem Error nun das Programm geschlossen wird :freak:

Verfasst: 13.12.2008 02:51
von freak
> Is mal wieder eins von Freds sinnlosen undingern das bei jedem Error nun das Programm geschlossen wird

a) das war nicht Fred sondern ich.
b) das "Resume" Feature hat nie wirklich zuverlässig funktioniert (konnte es gar nicht)
c) es macht nach 99% der Fehler sowiso überhaupt keinen Sinn das Programm fortzusetzen.
d) es wäre nicht auf allen Platformen machbar gewesen
e) wenn as so ein großes Unding ist, dann nimm doch einfach die Lib von 4.20 :roll:

Verfasst: 13.12.2008 03:06
von Thorium
Hm, keine Nanomites ohne Assembler also.
Aber wer progt sowas schon?

Generelles Ausführen des Programms geht ja wohl noch oder?
Also Verzweigung zu einer anderen Prozedur nach Exception. Wenn nicht, würd ich das schon als Unding bezeichnen.

Verfasst: 13.12.2008 11:46
von HeX0R
nicolaus hat geschrieben:[...]
und somit kannste in deinem Beispiel den Continue Button löschen.
[...]
Hab ich hiermit gemacht, danke für den Hinweis.
Thorium hat geschrieben: Generelles Ausführen des Programms geht ja wohl noch oder?
Also Verzweigung zu einer anderen Prozedur nach Exception.
OnErrorCall() ruft ja deine Prozedur bei Exception auf, nur von dieser kommst du nicht mehr in den Programmfluss zurück.

Muß aber auch sagen, dass ich mich an keinen Fall erinnere, wo dieses Continue tatsächlich funktionierte.
Von daher für mich kein Beinbruch.

Verfasst: 13.12.2008 14:28
von nicolaus
HeX0R hat geschrieben:
nicolaus hat geschrieben:[...]
und somit kannste in deinem Beispiel den Continue Button löschen.
[...]
Hab ich hiermit gemacht, danke für den Hinweis.
Thorium hat geschrieben: Generelles Ausführen des Programms geht ja wohl noch oder?
Also Verzweigung zu einer anderen Prozedur nach Exception.
OnErrorCall() ruft ja deine Prozedur bei Exception auf, nur von dieser kommst du nicht mehr in den Programmfluss zurück.

Muß aber auch sagen, dass ich mich an keinen Fall erinnere, wo dieses Continue tatsächlich funktionierte.
Von daher für mich kein Beinbruch.
Naja bei Division von null ist es z.b. nicht nötig das Programm gleich ganz zu schliessen.

Schau dir mal andere Sprachen an, die haben auch Exeption Handler und da wird auch nicht einfach das Programm geschlossen wenn ne Exeption aus´gelöst wird oder?

Ich finds schon recht komisch und schade das dieser weg jetzt eingeschlagen wurde.

Ich habe es bis einschliesslich PB4.20 so gemacht das ich die Fehler, auch die von OnError gemeldeten in einen Log geschrieben habe. Wenn es zu fehlern gekommen ist brauchten mir die User nur das Log schicken und konntene sonst noch weiter mit dem Program arbeiten.

Gerade bei sporadischen Fehlern die ab und zu auftauchen sollte es möglich sein das Programm weiter laufen zu lassen denke ich.

Gruß,
Nico