OnError-Include [PB4.x]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

OnError-Include [PB4.x]

Beitrag 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
Zuletzt geändert von HeX0R am 09.12.2020 14:14, insgesamt 5-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Warum hab ich die Übersehen?

:allright:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

:mrgreen: Klasse ! :allright:
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag 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. ;)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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:
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag 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:
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag 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.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
Antworten