TryCatch für Linux

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
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

TryCatch für Linux

Beitrag von remi_meier »

Wollte ich mal kurz so hier reinstellen, da ich bis am 10. Aug. wohl nichts
mehr machen kann.

Also wer die OnError-Lib für Linux vermisst, bzw. sich ein TryCatch für
Linux wünscht, der kann ev. mit diesem Code etwas anfangen. Es ist
wirklich nur ein Anfang, aber es kann ja ausgebaut werden :wink:

Dazu einfach schnell ein Auszug aus ner PN von mir an ts-soft vom 29. Jan.
(ich denke nicht, dass du was dagegen hast :wink: ):
Ok, ich bin zwar zu faul es als UserLib zu kompilieren, aber es scheint auch
so zu funktionieren. Es ist nicht komplett, aber es soll auch erstmal ein Test
sein, ob es halbwegs funktioniert

Code: Alles auswählen

#SIGINT  = 2       ;/* interrupt */ 
#SIGQUIT = 3       ;/* quit */ 
#SIGABRT = 6       ;/* abort() */ 
#SIGFPE  = 8       ;/* floating point exception */ 
#SIGKILL = 9       ;/* kill (cannot be caught Or ignored) */ 
#SIGSEGV = 11      ;/* segmentation violation */ 
#SIGPIPE = 13      ;/* write on a pipe With no one To Read it */ 
#SIGALRM = 14      ;/* alarm clock */ 
#SIGTERM = 15      ;/* software termination signal from kill */ 
#SIGSTOP = 17      ;/* sendable stop signal Not from tty */ 
#SIGTSTP = 18      ;/* stop signal from tty */ 
#SIGCONT = 19      ;/* Continue a stopped process */ 
#SIGCHLD = 20      ;/* To parent on child stop Or exit */ 
#SIGTTIN = 21      ;/* To readers pgrp upon background tty Read */ 
#SIGTTOU = 22      ;/* like TTIN For output If (tp->t_local&LTOSTOP) */ 
#SIGHUP  = 24      ;/* hangup */ 
#SIGILL  = 25      ;/* illegal instruction (Not reset when caught) */ 
#SIGUSR1 = 30      ;/* user defined signal 1 */ 
#SIGUSR2 = 31      ;/* user defined signal 2 */ 

Global *_tryifaddr, _trypos.l, _tryerror.l 
*_tryifaddr = malloc_(2048) ; STACK 
_trypos = 0 


Procedure TryError() 
  !MOV ecx, [p__tryifaddr] 
  !MOV edx, [v__trypos] 
  
  !MOV eax, [esp]  ; retaddr 
  !MOV [ecx + edx], eax  ; save jmpaddr 
  
  !MOV eax, esp 
  !ADD eax, 4 
  !MOV [ecx + edx + 4], eax ; save esp value 
  
  !ADD dword[v__trypos], 8 
  
  !MOV eax, 1  ; return #true 
  ProcedureReturn 
EndProcedure 


ProcedureC _trycatch_alarm(sig.l) 
  !MOV ecx, [p__tryifaddr] 
  !MOV edx, [v__trypos] 
  
  !MOV eax, [p.v_sig] 
  !MOV [v__tryerror], eax  ; save error num 
  
  !MOV esp, [ecx + edx - 4]  ; restore esp 
  
  !MOV ecx, [ecx + edx - 8]  ; get jmpaddr 
  
;   !ADD esp, 8  ;  retaddr + sig.l 
  !MOV eax, 0   ; TryError() returns #FALSE 
  !JMP ecx 
EndProcedure 

Procedure EndTryError() 
  !SUB dword[v__trypos], 8 
EndProcedure 

Procedure GetTryErrorCode() 
  ProcedureReturn _tryerror 
EndProcedure 


DisableDebugger ; it would catch our div 0 error 

; set some signal handlers: 
signal_(#SIGFPE, @_trycatch_alarm()) ; Arithmetic errors! 
signal_(#SIGALRM, @_trycatch_alarm()) ; Alarm signals 


a.l = 0 
If TryError() 
  If TryError() 
    MessageRequester("", "raise") 
    raise_(#SIGALRM) 
    MessageRequester("", "raised") ; never seen 
  Else 
    MessageRequester("", "caught alarm") 
  EndIf : EndTryError() 
  MessageRequester("", "outside alarm") 
  
  b = b / a 
Else 
  MessageRequester("", "caught div 0") 
EndIf : EndTryError() 
MessageRequester("", "outside") 

EnableDebugger 

Debug "öhm"
Die Konstanten oben sind die "Signale" (Exceptions in Windows), welche
vom System kommen können. Um ein Signal mit diesem TryCatch-Code
zu "handeln", muss man die Handler-Funktion dazu registrieren. Das macht
man z. B. so:
signal_(#SIGFPE, @_trycatch_alarm()) ; Arithmetic errors!
#SIGFPE ist das Signal. Wenn du z. B. noch "Invalid Memory Access"-Fehler
catchen möchtest, wäre das wohl #SIGSEGV, also
signal_(#SIGSEGV, @_trycatch_alarm()) ; Segmentation violation

eine Beschreibung zu den verschiedenen Signalen gibts hier:
http://www.gnu.org/software/libc/manual ... or-Signals
oder auch hier:
http://www.opengroup.org/onlinepubs/007 ... nal.h.html
Also wer etwas damit anfangen kann, viel Spass damit. Support kann ich
unter der Woche nicht geben, aber am Wochenende schaue ich ev. mal
wieder rein.

greetz
Remi