DMUG-Archiv 2021

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: [Dmug] Netzwerkfehler beim Abrufen einer Entity

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

Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html