ThomasS: Fehler abfangen

Hallo,

ich habe eine Funktion, die mehrere komplexe Funktionen aufruft und in denen unter Umständen Fehler auftreten können. Die "Überfunktion" soll aber trotzdem weiterleaufen, wenn ein Fehler in einer "Unterfunktion" auftritt. Geht das? Wie?

function ueberfunktion() {
  ...
  funktion_kann_fehler_auftreten();
  funktion_soll_trotz_fehler_ausgefuert_werden();
  ...
}

Über Antworten würde ich mich freuen.

Gruß ThomasS

  1. Die bessere Lösung für Dein Problem heißt: keine Fehler machen, sondern vorher prüfen, ob alles, was Fehler machen könnte, auch da ist.

    Die weniger gute Lösung: try { code } catch(e) { code }

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
    1. @@LX:

      nuqneH

      Die bessere Lösung für Dein Problem heißt: keine Fehler machen, sondern vorher prüfen, ob alles, was Fehler machen könnte, auch da ist.

      Alles, was Fehler machen könnte, sollte doch aber _nicht_ da sein! ;-)

      Qapla'

      --
      Volumen einer Pizza mit Radius z und Dicke a: pi z z a
      1. Nein, ansonsten wäre das gesamte DOM ja leer.

        Gruß, LX

        --
        RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
  2. Hi,

    Die "Überfunktion" soll aber trotzdem weiterleaufen, wenn ein Fehler in einer "Unterfunktion" auftritt. Geht das? Wie?

    Alternativ zum bereits erwähnten try-catch (und einer saubereren Programmierweise) gibt es noch window.onerror.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hallo,

      mit try-catch müsste ich doch alle Variablen sozusagen einzeln überwachen, oder? Und wenn ich window.onerror verwende müsste ich speichern wie weit die Funktion gekommen ist um die Ausführung entsprechend fortzusetzen, wenn ich das richtig verstehe.

      Gruß ThomasS

      Hi,

      Die "Überfunktion" soll aber trotzdem weiterleaufen, wenn ein Fehler in einer "Unterfunktion" auftritt. Geht das? Wie?

      Alternativ zum bereits erwähnten try-catch (und einer saubereren Programmierweise) gibt es noch window.onerror.

      MfG ChrisB

      1. Hi,

        bitte sinnvoll zitieren, das worauf du dich konkret beziehst.

        mit try-catch müsste ich doch alle Variablen sozusagen einzeln überwachen, oder?

        Von was für Variablen redest du jetzt?

        Und wenn ich window.onerror verwende müsste ich speichern wie weit die Funktion gekommen ist um die Ausführung entsprechend fortzusetzen, wenn ich das richtig verstehe.

        Wir wissen immer noch nicht, was du eigentlich vor hast, bzw. was dabei das Problem ist.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hallo,

          danke erstmal für die vielen Antworten.

          » function ueberfunktion() {
          »   ...
          »   funktion_kann_fehler_auftreten();
          »   funktion_soll_trotz_fehler_ausgefuert_werden();
          »   ...
          » }

          In funktion_kann_fehler_auftreten() lese ich über ein Textfeld eine Datei ein, der Code ist relativ komplex und eine geringe Änderung daran bringt wieder neue Kombinationen mit sich, die einen Fehler verursachen können (z.B. wenn das eingelesen, dann suche nach diesem usw.). Ich mache zwar bei Änderungen immer ein Code Review, aber ich würde sagen, dass ich garantiert den einen oder anderen Spezialfall übersehe. Die Funktion funktion_soll_trotz_fehler_ausgefuert_werden() gibt das was eingelesen wurde mittels HTML und DOM auf dem Bildschirm aus. Ärgerlich ist eben, wenn beim Einlesen ein Fehler auftritt und deshalb auch das korrekt eingelesene nicht angezeigt wird. Wenn ich einen Fehler finde mache ich den natürlich raus, aber um das Programm robuster zu machen, habe ich diese Frage gestellt.

          Gruß Thomas

      2. [latex]Mae  govannen![/latex]

        mit try-catch müsste ich doch alle Variablen sozusagen einzeln überwachen, oder? Und wenn ich window.onerror verwende müsste ich speichern wie weit die Funktion gekommen ist um die Ausführung entsprechend fortzusetzen, wenn ich das richtig verstehe.

        Erzähl doch einfach mal, was _konkret_ in der Funktion einen Fehler auslösen kann. Meistens ist bei sinnvoller Programmierung weder try-catch noch onerror überhaupt notwendig, wie LX bereits andeutete

        Cü,

        Kai

        --
        Resig is more like Javascript's Pee Wee Herman.  ;) (D.Mark in clj)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
  3. Hallo,

    Ein Programm sollte nie unkontrolliert Exceptions werfen. Es gibt nur sehr wenige Fälle, bei denen ein try-catch tatsächlich nötig ist. In allen anderen kann und sollte man Exceptions vermeiden. Das erreichst du durch passende Objektabfragen und Fallunterscheidungen.

    try-catch kannst du natürlich verwenden, um EIGENE Exceptions mittels throw zu erzeugen. Allerdings macht das nur Sinn, wenn du z.B. eine Bibliothek schreibst und den Anwender auf fehlerhafte Nutzung hinweisen willst.

    function ueberfunktion() {
      ...
      funktion_kann_fehler_auftreten();
      funktion_soll_trotz_fehler_ausgefuert_werden();
      ...
    }

    Hier solltest du nicht try-catch um die einzelnen Funktionsaufrufe packen. Damit erschwerst du nur höchstens das Debugging. Wie gesagt, wenn konkrete Befehle Exceptions werfen können, ohne dass du es verhindern kannst, dann umschließe DIESE gezielt mit einem try-catch - aber nicht große Code-Teile bloß auf Verdacht. Das holt dich irgendwann ein.

    Schreibe die Funktionen so, dass sie die Verfügbarkeit der benötigten JavaScript-Objekte prüfen, dass sie die Eingaben validieren und dadurch Exceptions vermeiden. Wenn diese nicht gegeben ist, dann beendest du die Funktion vorzeitig mit return;. Dann wird einfach die nächste Funktion ausgeführt.

    Siehe auch den Abschnitt zu try-catch im besagten Artikel.

    Wie gesagt, zeige mal bitte den Code, der konkret für Exceptions verantwortlich ist, dann können wir dir vermutlich eine geeignete Objektabfrage vorschlagen.

    Mathias