Hallo Peter,
das ist sehr allgemein geftragt, in den Bezug der Grössen (Ihr Beispiel
sEntity) sollte man es nicht verladen, die übliche Vorgehensweise ist
* die möglichen Zustände definieren (Konstanten mit erinnerbarer
Bedeutung)
o initialisierung
o Verbingungsaufnahme
o Datenbezug
o Aktion_1
o Aktion_2
o Verbingungsabbau
o ende
das Stichwort ist eine finite state machine; das kann mehrmals gemacht
werden,
wenn die Daten beisammen sind, kann man die Bearbeitung in eine eigene
finite
state machine auslagern (vulgo das nächste While ...) bis alles getan ist.
Dann ist muss man sich die Reaktionen überlegen, ein permanentes While
ohne Fehlerbehandlung (i.e. mal ein Päuschen einlegen) ist nicht sinnvoll,
irgendwann soll auch mal aufgehört werden. Im Pseudocode
enum {
none = 1,
init,
connect,
connecting,
connected,
interrupt,
querying,
gotit,
initfail,
connectfail,
....
} states;
bool doContinue = true;
int state = states.none;
int ret = 1; -- 0 ist gut
int maxFail = 7;
int failed = 0;
while ( doContinue) {
switch (state) {
case states.none:
ret = prepare_initialisation();
if ( !ret)
state = states.init;
else
doContinue = false;
break;
case states.init:
ret = prepare_connection();
if ( !ret) {
state = states.connect;
failed = 0;
}
else {
-- im Zustand init bleiben
++failed;
if ( failed > maxFail)
doContinue = false;
}
break;
...
case states.connected:
ret = get_data( which ones etc);
if ( !ret) {
state = state.querying;
failed = 0;
}
else {
if ( data_usable())
state = state.querying; -- handle it
else
state = states.interrupted;
-- set back;
}
break;
...
case states.interrupted:
ret = set_back(); -- kann eine Pause enthalten, Kontrollen etc.
if ( !ret) {
state = states.connected;
failed = 0;
}
else {
-- im Zustand interrupted bleiben
++failed;
if ( failed > maxFail)
doContinue = false;
}
break;
...
default:
-- sollte einem nicht passieren: maule übel
}
}
das kann auch in Mathematica gemacht werden; um z.B. eine
Internetadresse zu prüfen, kann es nützlich sein, von dort einen ping
zu bekommen und erst nach Erhalt fortzusetzen, der bekannte R. E. Ference
empfiehlt
https://reference.wolfram.com/language/guide/ExternalOperations.html
externe Operationen müssen sich auf die externen Gegebenheiten einstellen.
Wenn kein Präsenzcheck angeboten wird, muss man auf etwas anderes
ausweichen.
Es kann auch sehr nützlich sein (check_data()) bereits erhaltene Daten
lokal zu speichern, im Ernstfall kann dafür - falls vorhanden - eine
Versionskontrolle verwendet werden ( erfolgreiche Änderungen werden
committed oder pushed), so dass man in jedem Fall ein Stückchen
weiterkommt und beim nächsten Run nicht erneut die Daten aus dem Netz
holen muss, sondern aus der lokalen Quelle lädt und dann fortsetzt.
HTH
Udo.
Am 04.08.2021 um 00:42 schrieb Peter Klamser via demug:
... es geht also darum so lange mit einer While Schleife Entity zu pollen,
bis kein Fehler mehr vorliegt,
Damit kann ich eine längere Berechnung bei einem Netzwerkfehler retten.
Danke sagt Peter
Am Di., 3. Aug. 2021 um 22:33 Uhr schrieb Peter Klamser <klamser@XXXXXXX.com>:
Hallo,
beim Abrufen einer Entity kann ein Netzwerkfehler auftreten, wenn z.B. der
ISP meint, er müsse irgendwas ändern, wobei dann kein Zugang zu WRI besteht.
Ich habe das versucht mit einer Enclose ConfirmQuiet konstrukt abzufangen.
Aber so ganz klappt das nicht.
Wie geht das?
Eine gute Woche wünscht Peter
_______________________________________________
DMUG Deutschsprachiges Mathematica-Forum demug@XXXXXXX.ch
http://www.mathematica.ch/mailman/listinfo/demug
Archiv: http://www.mathematica.ch/archiv.html
_______________________________________________
DMUG Deutschsprachiges Mathematica-Forum demug@XXXXXXX.ch
http://www.mathematica.ch/mailman/listinfo/demug
Archiv: http://www.mathematica.ch/archiv.html