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
Dazu einfach schnell ein Auszug aus ner PN von mir an ts-soft vom 29. Jan.
(ich denke nicht, dass du was dagegen hast ):
Also wer etwas damit anfangen kann, viel Spass damit. Support kann ichOk, 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 funktioniertDie Konstanten oben sind die "Signale" (Exceptions in Windows), welcheCode: 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<OSTOP) */ #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"
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
unter der Woche nicht geben, aber am Wochenende schaue ich ev. mal
wieder rein.
greetz
Remi