Funktion mit timer frühzeitig beenden

felix123123

Neues Mitglied
Hallo, ich habe bei meinem code oft das problem das er nichts ausgibt oder die funktion einfach zulange dauert, gibt es eine möglichkeit am anfang der funktion zusagen das diese funktion beendet werden soll und eine andere gestartet werden soll wenn nicht irgendein abbruchs befehl kommt? Das würde dann ungefähr so aussehen
Code:
function meinefunktion(variable,variable){
timer(abbruch nach 10 sekunden)

meincode()

timerstopp()
}
das die funktion angehalten wird wenn sie zulange braucht. Gibt es dafür eine möglichkeit?
 

Lowl3v3l

Mitglied
devCommunity-Experte
Das klingt für mich allgemein erstmal nach einem Designfehler, wenn die mittendrin abbricht gibt es immerhin einen undefinierten Zustand, keinen Rückgabewert etc.

Du willst, ich kenne deinen genauen Use-Case nicht, da vermutlich eher asynchrone funktionen und Promises benutzen, hier gibts ein Beispiel dafür(ist nicht von mir): https://codepen.io/seb-rom-o/pen/eYZpaod?editors=0010

Mfg, Lowl3v3l
 

felix123123

Neues Mitglied
Also das was ich programmiere ist halt für eine Website und für benutzer außer mir. Ansich funktioniert die Software aber es gibt halt sehr viele möglichkeiten wie der benutzer das ganze falsch machen kann, ich versuche die meisten falschen möglichkeiten zu blockieren aber es könnte immernoch sein das ich eine dieser lücken nicht gefunden habe und diese sorgen dafür das nichts passiert, in diesem Fall will ich halt einfach einen Timer setzten um eine nachricht zu senden die dem benutzer praktisch sagt das er etwas falsch gemacht hat.

Ich kann das halt nicht machen mit undefined und so weil es wenn irgendwo ein fehler ist eine fehlermeldung in der konsole gibt und nicht mehr weiterläuft und das wil ich halt mit einem Timer umgehen. Ich versuch das ganze jetzt mit diesem promise aber ich wollte hier mal erklären warum ich das ganze nicht anders machen kann.
 

Lowl3v3l

Mitglied
devCommunity-Experte
Ich kenne deinen Code nicht, aber gibt es da keine Möglichkeit, das über saubere Exceptions zu machen? "Terminiert einfach nicht" ist schlicht nichts, das in irgendeinem Fehlerfall auftreten sollte, der sich aus einer Benutzereingabe ergibt, das Einzige wo das passieren können sollte wären irgendwelche Fehler von Seiten des Betriebssystems oder der Runtime (race-conditions, out of memory-Exceptions oder so wären ein typisches Beispiel).
 

Lowl3v3l

Mitglied
devCommunity-Experte
Try-catch-finally ist genau für solche Konstrukte da: in einem Try-Block auftretende Exceptions können in folgenden Catch- und Finally-Blöcken behandelt werden, ja(ich weiß aber aus dem Kopf nicht, ob es in Javascript exceptions gibt, bei denen das nicht geht, aber generell kannst du Exceptions so abfangen, ja).

Die Mechanik ist so: der Code im try wird ausgeführt. Tritt eine Exception auf wird direkt der catch aufgerufen, der Rest des try wird nicht ausgeführt. Sobald entweder der try oder der catch Block zuende ausgeführt sind(also eigentlich in jedem sauber programmierten Fall) wird der finally Block ausgeführt, in dem für gewöhnlich das abschließende Aufräumen passiert. Fängst du eine Exception nicht, aber sie tritt trotzdem auf beendet sie das Programm und wirft im Browser oder der Engine die du benutzt einen Fehler(Exceptions werden immer von unten nach oben durchgereicht, der engste catch-Block greift zuerst, falls es mehrere Kandidaten gibt). Exceptions können implizit im Code auftreten den du schreibst(zum Beispiel wenn du auf eine Datei zugreifen willst, für die du nicht die Rechte hast müsste das in node passieren, AFAIK), oder direkt per throw geworfen werden(das passiert ultimativ auch in Bibliotheksfunktionen, die Exceptions werfen können).

Javascript:
try {
    console.log('Hello');
    throw 'NAN!';
    console.log('World');
} catch {
    console.log('Exception');
} finally {
    console.log('Finis');
}

Dieser Code zum Beispiel gibt "Hello", "Exception", "Finis" aus. Kommentierst du die throw-Zeile aus gibt es "Hello","World","Finis".
 

felix123123

Neues Mitglied
OK, das ganze funktioniert jetzt zwar aber auch nicht so richtig. Ich hab erstmal noch 3 fragen:
1.Triggert catch immer sobald irgendwo etwas falsch ist z.B NaN?
2. wozu brauch ich das throw?
3.Funktioniert das bei allen fehlertypen

Weil das ganze triggerd bei mir jetzt teilweise aber auch teilweise nicht und ich weiß nicht was das bedeuten soll.

Danke schonmal im vorraus
 

aligator

Neues Mitglied
1.Triggert catch immer sobald irgendwo etwas falsch ist z.B NaN?
Nein, es triggert NUR wenn innerhalb des try-catch ein
throw aufgerufen wird.
Entweder von dir selber oder von irgend einer funktion die du aufrufst.

2. wozu brauch ich das throw?
Wie bei 1. geschrieben brauchst du das throw damit das try-catch überhaupt etwas catchen kann.

3.Funktioniert das bei allen fehlertypen
JavaScript ist hier etwas speziell, denn im Gegensatz zu den meisten anderen Sprachen (wo man nur wirkliche "Error" objekte schmeißen ("throw"en) kann), ist es in JavaScript tatsächlich möglich alles zu schmeißen:

in js ist z.B. alles folgende möglich:

Javascript:
throw new Error('ein error');

throw 'ein anderer error';

throw 34556;

throw {
    some: 'json',
};

// etc...
Wobei wirklich schöner code ist nur ersteres und es sollte bevorzugt werden.

Wenn du irgendetwas gschmißen hast, dann kannst du im catch das eben geschmissene wider bekommen:
Javascript:
try {
    console.log('Hello');
    throw new Error('Not a number');
    console.log('World');
} catch (err) {
    // Hier in "err" ist genau das was du oben nach throw geschrieben hast.
    // Also in diesem Fall der Error('Not a number')
    console.log('error was thrown');
    console.log(err);
} finally {
    console.log('Finis');
}


Dagegen z.B. in java kann man NUR Exception Objekte schmeißen, also alles was von Exception erbt:

Java:
throw new IllegalArgumentException("Kein Alter <= 0 erlaubt!");

throw new NullPointerException("return value is null at method AAA");

// Nicht möglich ist dagegen
throw "nooooo";

throw 8;
 
Zuletzt bearbeitet:

felix123123

Neues Mitglied
Also wenn ich das richtig verstanden hab müsste ich wenn ich weiß das meinetwegen in Zeile 23 ein Wert einen fehler geben könnte werf ich diesen erstmal mit throw und so umgehe ich dann meine grenzwertigen oder komplizierten stellen im code oder?
 

aligator

Neues Mitglied
ja genau.

nur dass du nicht unbedingt den fehlerhaften wert selber schmeissen musst sondern am besten eine Beschreibung des Fehlers.

du bist auf dem richtigen Weg :)
 
Oben Unten