Aktuelle Zeit: 23.10.2018 09:26

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: OnError-Include [PB4.x]
BeitragVerfasst: 17.02.2006 16:14 
Offline
Benutzeravatar

Registriert: 10.09.2004 09:59
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

Code:
;+------------------------------------------------------
;|
;| 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 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

   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$)

   ErrorHWND = OpenWindow(#PB_Any, 0, 0, 400, 270,  #APP_NAME + " V" + #APP_VERSION + " [RunTime-Error]", #PB_Window_ScreenCentered)
   If ErrorHWND
      CompilerIf #PB_Compiler_Version < 430
      CreateGadgetList(WindowID(ErrorHWND))
      CompilerEndIf
      ImageGadget(#PB_Any, 10, 10, 32, 32, LoadIcon_(0, #IDI_HAND))
      TextGadget(#PB_Any, 60, 10, 280, 32, "An Error occured while running '" + GetFilePart(ProgramFilename()) + "'")
      A = EditorGadget(#PB_Any, 10, 50, 380, 170, #PB_Editor_ReadOnly)
      SetGadgetText(A, MessageBody + #CRLF$)
      CompilerIf #PB_Compiler_Version < 430
      A = ButtonGadget(#PB_Any, 10, 230, 120, 27, "&End")
      B = ButtonGadget(#PB_Any, 140, 230, 120, 27, "&Send email")
      C = ButtonGadget(#PB_Any, 270, 230, 120, 27, "&Continue")
      CompilerElse
      A = ButtonGadget(#PB_Any, 10, 230, 120, 27, "&End")
      B = ButtonGadget(#PB_Any, 270, 230, 120, 27, "&Send email")
      C = -1
      CompilerEndIf
      SetActiveGadget(C)

      StickyWindow(ErrorHWND, #True)

      Repeat
         Select WaitWindowEvent()
            Case #PB_Event_Gadget
               Select EventGadget()
                  Case A
                     End
                  Case B
                     RunProgram(Mail)
                  Case C
                     CloseWindow(ErrorHWND)
                     ProcedureReturn 1
               EndSelect
            Case #PB_Event_CloseWindow
               If EventWindow() = ErrorHWND
                  Break
               Else
                  End
               EndIf
         EndSelect
      ForEver
   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 13.12.2008 11:43, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 23.07.2007 21:22 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Warum hab ich die Übersehen?

:allright:

_________________
PureBasic 5.70 | SpiderBasic 2.10 | Windows 10 Pro (x64) | Linux Mint 19.0 (x64)
"Ich möchte gerne die Welt verändern, doch Gott gibt den Quellcode nicht frei."
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 25.07.2007 14:56 
Offline
Benutzeravatar

Registriert: 10.10.2004 18:56
:mrgreen: Klasse ! :allright:

_________________
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 25.07.2007 15:31 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
Ich hab den obigen Code mit der Division durch Null (auskommentieren der letzten Zeile des Beispiel-Codes) getestet.

Woher kommt der DLL-Fehler:
Zitat:
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 / Windows 7
PB Last Final / Last Beta Testing


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 12.12.2008 21:50 
Offline
Benutzeravatar

Registriert: 10.09.2004 09:59
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. ;)

_________________
Link tot?
Ändere h3x0r.ath.cx in hex0rs.coderbu.de und alles wird gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 13.12.2008 02:05 
Offline
Moderator
Benutzeravatar

Registriert: 11.09.2004 13:09
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:

_________________
SkyBeat Piloten und ATC Informationssystem


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 13.12.2008 02:51 
Offline
PureBasic Team

Registriert: 29.08.2004 00:20
Wohnort: Stuttgart
> 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:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 13.12.2008 03:06 
Offline
Benutzeravatar

Registriert: 12.06.2005 11:15
Wohnort: Germany
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 13.12.2008 11:46 
Offline
Benutzeravatar

Registriert: 10.09.2004 09:59
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.

_________________
Link tot?
Ändere h3x0r.ath.cx in hex0rs.coderbu.de und alles wird gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 13.12.2008 14:28 
Offline
Moderator
Benutzeravatar

Registriert: 11.09.2004 13:09
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

_________________
SkyBeat Piloten und ATC Informationssystem


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye