Macro Error abfangen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Macro Error abfangen

Beitrag von Leon »

Hallo aus Wien,

ich habe ein Problem bei der Umstellung eines Clipper Programmes. In diesem Programm gibt es ein längeres Textfeld, in das Berechnungsformeln geschrieben werden und ein Errorhandler hat unter Clipper einen Fehler abgefangen und den Benutzer darauf hingewiesen, dass ein logischer Fehler in der Formel ist. Unter XPP fängt die Funktion aber nicht den Fehler ab, sondern steigt mit einem XPPFATAL aus. Kann mir bitte jemand sagen, wo ich den Fehler mache?

Code: Alles auswählen

function a_chk(zz1,zz2,zz3,zz4,zz5,zz6,c_get)
local ret_val:=.t.,;
      anzsa:=numat("(",zz1+zz2+zz3+zz4+zz5+zz6),;
      anzsb:=numat(")",zz1+zz2+zz3+zz4+zz5+zz6),;
      falsch,;
      zeichenkette
local bErrorHandler, bLastHandler, objError
private erg

zz1=atrepl(",",zz1,".")
zz2=atrepl(",",zz2,".")
zz3=atrepl(",",zz3,".")
zz4=atrepl(",",zz4,".")
zz5=atrepl(",",zz5,".")
zz6=atrepl(",",zz6,".")

setprec(4)
set decimals to 2
zeichenkette=zz1+zz2+zz3+zz4+zz5+zz6
erg:=strtran(zeichenkette," ","")
erg:=zeichenkette
if lastkey()=5 .or. lastkey()=24
   return(.t.)
endif
c_get=currentget()
if anzsa=0 .and. anzsb=0
   ret_val=.t.
else
   if anzsa#anzsb
      ret_val:=.f.
      if anzsa#anzsb
         alert("Klammerausdruck fehlerhaft, bitte korrigieren!",{"OK"},,"W+/B,W+/B")
      endif
      return(ret_val)
   endif
endif

bErrorHandler:={|objError|RechenError(objError)}
bLastHandler:=errorblock(bErrorHandler)

begin sequence
   falsch=&erg
   recover // using objErrorInfo
   ret_val=.f.
end sequence
errorblock(bLastHandler)
return(ret_val)
*
function RechenError(objError)
if objError:SubCode=1513
   alert("ACHTUNG!;"+;
      "Die Formel ist zu komplex für eine Auswertung.;"+;
      "Kürzen oder vereinfachen Sie bitte die Formel.",{"OK"},,"W+/B,W+/B")
      break objError
elseif objError:SubCode=1449
   alert("ACHTUNG! ("+strzero(objError:subCode,4)+");"+;
      "In der Formel ist ein logischer Fehler enthalten.;"+;
      "Möglicherweise ist in der Formel ein Leerzeichen ;"+;
      "enthalten oder es sind mehrere Zeilen ohne Opera-;"+;
      "tionszeichen (+ - * /) miteinander verbunden.    ;"+;
      "Falsch:;"+;
      "5* (3. 14 * 5.29 ) / 3 (99 - 33);"+;
      "Richtig:;"+;
      "5*(3.14*5.29)/3*(99-33)",{"Formel korrigieren"},,"W+/B,W+/B")
      break objError
else
   alert("ACHTUNG! ("+strzero(objError:subCode,4)+");"+;
      "In der Formel ist ein logischer Fehler enthalten.;"+;
      "Möglicherweise wurde ein mathematischer Operator ;"+;
      "vergessen (+ - * /). Nachstehend zwei Beispiele: ;"+;
      "Falsch:;"+;
      "5(3.14*5.29)/3(99-33);"+;
      "Richtig:;"+;
      "5*(3.14*5.29)/3*(99-33)",{"Formel korrigieren"},,"W+/B,W+/B")
      break objError
endif
return NIL   
Hier der Fehler der XPPFATAL:

FATAL ERROR LOG
Stack Overflow
SYS Thread-ID: 520
Module: EH
Error Codes: EH: 12 Sub: 0(0) OS: 0 XPP: 16
Call Stack of Thread 1 (520):
RECHENERROR(470)
(B)A_CHK@0003(434)
RECHENERROR(470)
(B)A_CHK@0003(434)
RECHENERROR(470)
(B)A_CHK@0003(434)
RECHENERROR(470)
(B)A_CHK@0003(434)
RECHENERROR(470)
(B)A_CHK@0003(434)
RECHENERROR(470)
(B)A_CHK@0003(434)
RECHENERROR(470)......

Was mach ich falsch?
Gruß aus Wien
Leon
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Macro Error abfangen

Beitrag von Jan »

Hallo Leon,

wo genau sind denn die Zeilen 434 und 470? Das würde es einfacher machen worauf genau geschaut werden muß.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Macro Error abfangen

Beitrag von Leon »

Jan hat geschrieben:Hallo Leon,

wo genau sind denn die Zeilen 434 und 470? Das würde es einfacher machen worauf genau geschaut werden muß.
Ich habe die Zeilennummern rot eingefärbt.

bErrorHandler:={|objError|RechenError(objError)} // ZEILE 434
bLastHandler:=errorblock(bErrorHandler)

begin sequence
falsch=&erg
recover // using objErrorInfo
ret_val=.f.
end sequence
errorblock(bLastHandler)
return(ret_val)
*
function RechenError(objError)
if objError:SubCode=1513
alert("ACHTUNG!;"+;
"Die Formel ist zu komplex fr eine Auswertung.;"+;
"Krzen oder vereinfachen Sie bitte die Formel.",{"OK"},,"W+/B,W+/B")
break objError
elseif objError:SubCode=1449
alert("ACHTUNG! ("+strzero(objError:subCode,4)+");"+;
"In der Formel ist ein logischer Fehler enthalten.;"+;
"M”glicherweise ist in der Formel ein Leerzeichen ;"+;
"enthalten oder es sind mehrere Zeilen ohne Opera-;"+;
"tionszeichen (+ - * /) miteinander verbunden. ;"+;
"Falsch:;"+;
"5* (3. 14 * 5.29 ) / 3 (99 - 33);"+;
"Richtig:;"+;
"5*(3.14*5.29)/3*(99-33)",{"Formel korrigieren"},,"W+/B,W+/B")
break objError
else
alert("ACHTUNG! ("+strzero(objError:subCode,4)+");"+;
"In der Formel ist ein logischer Fehler enthalten.;"+;
"M”glicherweise wurde ein mathematischer Operator ;"+;
"vergessen (+ - * /). Nachstehend zwei Beispiele: ;"+;
"Falsch:;"+;
"5(3.14*5.29)/3(99-33);"+;
"Richtig:;"+;
"5*(3.14*5.29)/3*(99-33)",{"Formel korrigieren"},,"W+/B,W+/B")
break objError // ZEILE 470
endif
return NIL
Gruß aus Wien
Leon
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Macro Error abfangen

Beitrag von Leon »

Sorry für die Umstände, der Fehler war die geänderte Syntax von ALERT() in Alaska:

Alaska: Alert("Fehler", {"Korrektur"}, "W/B, R/W")

Clipper: Alert("Fehler", {"Korrektur"}, , "W/B, R/W")

LG aus Wien
Leon
Gruß aus Wien
Leon
Antworten