From 03b377285a88dbe714b0c27ecaa892c7c5b026c1 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Mon, 5 Oct 2015 11:18:29 +0200 Subject: Physikunit.pas raised nun im Falle eines Fehlers exceptions anstatt per halt zu beenden --- Physikunit.pas | 86 ++++++++++++++++++++++------------------------------------ 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/Physikunit.pas b/Physikunit.pas index c35c239..bc23f05 100644 --- a/Physikunit.pas +++ b/Physikunit.pas @@ -267,9 +267,7 @@ begin nam:=nam+', '+matSpeicherNamen[maF]; delete(nam,1,2); pro.schreibe('Ich kenne nur: '+nam,true); - - pro.destroyAll; - halt(1); + raise exception.create('Fehler in tAusgabeDatei.create!'); end; case wasSpeichern of @@ -298,8 +296,7 @@ begin freeMem(buf,bufLen); if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); - pro.destroyall; - halt(1); + raise exception.create('Fehler in tAusgabeDatei.destroy!'); end; inherited destroy; end; @@ -336,8 +333,7 @@ procedure tAusgabeDatei.schreibeKopf; begin if (tCnt<>zeitAnz) and ((nNum<>0) or (tCnt<>-1)) then begin pro.schreibe('Falsche Anzahl an Zeitschritten in '+pre+'-'+inttostr(nNum-1)+suf+' geschrieben ('+inttostr(tCnt)+' statt '+inttostr(zeitAnz)+')!',true); - pro.destroyall; - halt(1); + raise exception.create('Fehler in tAusgabeDatei.schreibeKopf!'); end; if bufPos<>0 then schreibeBuffer(0); @@ -356,8 +352,7 @@ var i,cnt: longint; begin if (teilchen>=length(gitter.felders[gitter.aktuelleFelder].teilchen)) then begin pro.schreibe('Teilchen '+inttostr(teilchen+1)+' gibt es nicht, da kann ich auch nichts speichern!',true); - pro.destroyall; - halt(1); + raise exception.create('Fehler in tAusgabeDatei.speichereWerte!'); end; if sT>=nNum+sDT/2 then @@ -373,8 +368,7 @@ begin if bufLen-bufPos < sizeof(longint) + (2+cnt)*sizeof(double) then begin pro.schreibe('Schreibbuffer ist zu klein ('+inttostr(bufLen)+' statt mindestens '+inttostr(sizeof(longint) + (2+cnt)*sizeof(double))+' Bytes)!'); - pro.destroyall; - halt(1); + raise exception.create('Fehler in tAusgabeDatei.speichereWerte!'); end; move(cX,(buf+bufPos)^,sizeof(double)); @@ -421,8 +415,7 @@ begin end{of case}; if cnt<>0 then begin pro.schreibe('Falsche Anzahl an Ortsschritten geschrieben ('+inttostr(cnt)+')!',true); - pro.destroyall; - halt(1); + raise exception.create('Fehler in tAusgabeDatei.speichereWerte!'); end; end; @@ -516,8 +509,7 @@ begin repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in Parameterdatei im Bereich teilchen -> verteilung stückweise!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tTeilchenSpezies.liesDichteFunktion!'); end; if length(dichteStuecke)=length(ortsGrenzen) then begin // neues Funktionsstück wird definiert @@ -538,8 +530,7 @@ begin ori:=strtoint(rest)-1; if (ori<0) or (ori>=length(teilchen)-1) then begin prot.schreibe('Kann mich nicht auf die Dichte von Teilchen '+inttostr(ori+1)+' beziehen, weil es noch nicht definiert wurde!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tTeilchenSpezies.liesDichteFunktion!'); end; setlength(ortsGrenzen,length(teilchen[ori].ortsGrenzen)); for i:=0 to length(ortsGrenzen)-1 do @@ -756,24 +747,21 @@ begin if (abs(lFftTmp^.re-pi)>1e-10) or (abs(lFftTmp^.im-sqr(pi))>1e-10) then begin gitter.prot.schreibe(fehler); gitter.prot.schreibe(floattostr(lFftTmp^.re)+' vs. '+floattostr(pi)+' und '+floattostr(lFftTmp^.im)+' vs. '+floattostr(sqr(pi))); - gitter.prot.destroyall; - halt(1); + raise exception.create('Fehler in tFelder.pruefeArrayEnden!'); end; for i:=0 to length(impulsRaumGradient)-1 do for j:=0 to 1 do if abs((impulsRaumGradient[i,j]+aP*aX)^-pi)>1e-10 then begin gitter.prot.schreibe(fehler); gitter.prot.schreibe(floattostr((impulsRaumGradient[i,j]+aP*aX)^)+' vs. '+floattostr(pi)); - gitter.prot.destroyall; - halt(1); + raise exception.create('Fehler in tFelder.pruefeArrayEnden!'); end; for i:=0 to length(impulsRaum)-1 do for abl:=false to true do if abs((impulsRaum[i,abl]+aP*aX)^-pi)>1e-10 then begin gitter.prot.schreibe(fehler); gitter.prot.schreibe(floattostr((impulsRaum[i,abl]+aP*aX)^)+' vs. '+floattostr(pi)); - gitter.prot.destroyall; - halt(1); + raise exception.create('Fehler in tFelder.pruefeArrayEnden!'); end; end; @@ -987,8 +975,7 @@ begin eqJY: result:=impulsIntegral(ort,tlc,msVY); else begin gitter.prot.schreibe('unbekannte EMQuellgröße in Impulsintegral!'); - gitter.prot.destroyall; - halt(1); + raise exception.create('Fehler in tFelder.impulsIntegral!'); end; end{of case}; result:=result * teilchen[tlc].eigenschaften[tsgLadung]; @@ -1052,8 +1039,7 @@ begin result + abs((impulsraum[tlc,false]+i+ort*aP)^-(impulsraum[tlc,false]+i-1+ort*aP)^)*dP; else begin gitter.prot.schreibe('unbekannte Materiefeldgröße in Impulsintegral!'); - gitter.prot.destroyall; - halt(1); + raise exception.create('Fehler in tFelder.impulsIntegral!'); end; end{of case}; end; @@ -1238,8 +1224,7 @@ begin ifile.loadfromfile(inName); if not ifile.unfoldMacros then begin prot.schreibe('Fehlerhafte Macros in Parameterdatei '''+inName+'''!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; // Standardeinstellungen Bereich 'allgemein' @@ -1275,8 +1260,7 @@ begin repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in '''+inName+'''!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; if s='Dateiende' then @@ -1286,8 +1270,7 @@ begin repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich allgemein!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; if s='allgemeinEnde' then break; if s='runge-Kutta-3/8' then begin @@ -1349,8 +1332,7 @@ begin continue; end; prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich allgemein!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); until false; continue; end; @@ -1359,8 +1341,7 @@ begin repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich ausgaben!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; if s='ausgabenEnde' then break; if startetMit('suffix ',s) then begin @@ -1389,8 +1370,7 @@ begin continue; end; prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich ausgaben!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); until false; continue; end; @@ -1405,23 +1385,20 @@ begin continue; end; prot.schreibe('Licht kann nicht von '''+erstesArgument(s)+''' kommen!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; if startetMit('teilchen',s) then begin if (s<>'') and (strtoint(s)<>length(teilchen)+1) then begin prot.schreibe('Ich erwarte die Teilchen beginnend bei 1 der Reihe nach in Parameterdatei '''+inName+'''!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; setlength(teilchen,length(teilchen)+1); teilchen[length(teilchen)-1]:=tTeilchenSpezies.create; repeat if not ifile.readln(s) then begin prot.schreibe('Unerwartetes Dateiende in Parameterdatei '''+inName+''' im Bereich teilchen!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; if s='teilchen'+inttostr(length(teilchen))+'Ende' then break; if startetMit('ladung ',s) then begin @@ -1463,23 +1440,20 @@ begin end; prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+''' im Bereich teilchen!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); until false; continue; end; prot.schreibe('Unbekannter Befehl '''+s+''' in Parameterdatei '''+inName+'''!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); until false; ifile.free; if length(ausgabedateien)=0 then begin prot.schreibe('Du solltest irgendetwas abspeichern lassen!',true); - prot.destroyall; - halt(1); + raise exception.create('Fehler in tSimulation.create!'); end; if dT<0 then @@ -1552,8 +1526,8 @@ begin na^.sa_Restorer := Nil; {$endif} if (fPSigaction(SIGHUP, na, nil) <> 0) then begin - writeln(stderr, 'Error: ', fpgeterrno, '.'); - halt(1); + pro.schreibe('Fehler: '+inttostr(fpgeterrno)+'.'); + raise exception.create('Fehler in tSimulation.create!'); end; dispose(na); end; @@ -1596,8 +1570,12 @@ begin dT:=sDT; zeitPhysik:=zeitPhysik-now; - if errorCode<2 then + if errorCode<2 then try gitter.iteriereSchritt(dT); + except + zeitPhysik:=zeitPhysik+now; + exit; + end; zeitPhysik:=zeitPhysik+now; zeitDatei:=zeitDatei-now; while (gitter.t>=sT) and (sT