1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>SELFHTML: JavaScript / Anwendungsbeispiele / Fehlerbehandlung mit dem try..catch-Statement</title>
<link rel="stylesheet" type="text/css" href="../../src/selfhtml.css">
<meta name="description" content="Wie Sie Fehler in JavaScripts abfangen knnen.">
<meta name="keywords" content="SELFHTML, JavaScript, Fehler, Error, try, throw, catch">
<meta name="author" content="Redaktion SELFHTML, selfhtml81@selfhtml.org">
<meta name="robots" content="noindex, nofollow">
<meta name="DC.Publisher" content="SELFHTML e. V.">
<meta name="DC.Date" content="2005-08-22T21:21:39+02:00">
<meta name="DC.Identifier" content="http://de.selfhtml.org/javascript/beispiele/fehlerbehandlung_try_catch.htm">
<meta name="DC.Language" content="de">
<meta name="DC.Rights" content="../../editorial/copyright.htm">
<meta name="DC.Date.created" content="2001-10-27T08:00+01:00">
<meta name="SELF.Pagetype" content="page">
<link rel="alternate" type="application/atom+xml" title="SELFHTML-Weblog (Atom, gesamt)" href="http://aktuell.de.selfhtml.org/weblog/atom-feed">
<link rel="alternate" type="application/rss+xml" title="SELFHTML-Weblog (RSS, Auszge)" href="http://aktuell.de.selfhtml.org/weblog/rss-feed">
<link rel="shortcut icon" type="image/x-icon" href="../../src/favicon.ico">
<link rel="author" title="Impressum" href="../../editorial/impressum.htm">
<link rel="contents" title="Inhaltsverzeichnis" href="../../navigation/inhalt.htm">
<link rel="index" title="Stichwortverzeichnis" href="../../navigation/stichwort.htm">
<link rel="search" title="Suche" href="../../navigation/suche/index.htm">
<link rel="help" title="Hilfe" href="../../editorial/index.htm">
<link rel="copyright" title="Urheberrecht" href="../../editorial/copyright.htm">
<link rel="top" title="SELFHTML" href="../../index.htm">
<link rel="up" title="Anwendungsbeispiele" href="index.htm">
<link rel="next" title="nderungen der Fenstergre berwachen" href="fensterueberwachen.htm">
<link rel="prev" title="Fehlerbehandlung mit dem Event-Handler onerror" href="fehlerbehandlung.htm">
<link rel="first" title="Zwei Frames gleichzeitig ndern" href="zweiframes.htm">
<link rel="last" title="nderungen der Fenstergre berwachen" href="fensterueberwachen.htm">
</head>
<body>
<table cellpadding="4" cellspacing="0" border="0" width="100%">
<tr>
<td colspan="2" class="nav"><a class="an" name="top"><img src="../../src/refkap.gif" width="16" height="13" alt="Teil von"></a> <a href="../../index.htm">SELFHTML</a>/<a href="../../navigation/index.htm" target="_parent" class="navh">Navigationshilfen</a> <img src="../../src/refkap.gif" width="16" height="13" alt="Teil von"> <a href="../index.htm">JavaScript/DOM</a> <img src="../../src/refkap.gif" width="16" height="13" alt="Teil von"> <a href="index.htm">Anwendungsbeispiele</a></td>
</tr>
<tr>
<td class="doc" width="110"><a href="../../index.htm"><img src="../../src/logo.gif" width="106" height="109" border="0" alt="SELFHTML"></a></td>
<td class="docbot" width="100%"><h1 class="ph1">Fehlerbehandlung mit dem try..catch-Statement</h1></td>
</tr>
<tr>
<td class="doctop">
<img src="../../src/dokx.gif" width="30" height="20" vspace="6" alt="Informationsseite">
</td>
<td valign="top" nowrap="nowrap">
<p>
<img src="../../src/down.gif" width="14" height="10" alt="nach unten"> <a href="#hinweise">Hinweise zu diesen Beispielen</a><br>
<img src="../../src/down.gif" width="14" height="10" alt="nach unten"> <a href="#quelltext">Quelltext mit Erluterungen</a><br>
</p>
<p><img src="../../src/dokf.gif" width="15" height="10" alt="Beispiel-Seite"> <a href="anzeige/fehlerbehandlung_try_catch.htm">Anzeigebeispiel: So sieht's aus</a></p>
</td>
</tr><tr><td colspan="2" class="doc"> <a href="#bottom"><img src="../../src/down.gif" width="14" height="10" border="0" alt="nach unten"></a> </td></tr>
</table>
<h2><a class="an" name="hinweise">Hinweise zu diesem Beispiel</a></h2>
<p>Mit Hilfe der <img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="fehlerbehandlung.htm">Fehlerbehandlung mit dem Event-Handler onerror</a> knnen Sie in einem JavaScript Fehler abfangen, <b>nachdem</b> diese aufgetreten sind. Mit der hier vorgestellten Methode knnen Sie jedoch bereits im Vorfeld verhindern, dass in kritischen Situationen berhaupt Fehler auftreten. Dazu steht seit der JavaScript-Version 1.5 das <code>try..catch</code>-Statement zur Verfgung. Es erlaubt Ihnen, Variablen und Werte zu berprfen und je nach Ergebnis zu reagieren. Dieses Statement wird vom Internet Explorer ab Version 5.0, von Netscape ab Version 6.0 und von Opera ab Version 5 interpretiert.</p>
<p class="doc"><a href="#top"><img src="../../src/up.gif" width="14" height="10" border="0" alt="nach oben"></a><a href="#bottom"><img src="../../src/down.gif" width="14" height="10" border="0" alt="nach unten"></a></p>
<h2><img src="../../src/js15.gif" width="30" height="30" alt="JavaScript 1.5" title="JavaScript 1.5"><img src="../../src/netsc6.gif" width="30" height="30" alt="Netscape 6.0" title="Netscape 6.0"><img src="../../src/msie5.gif" width="30" height="30" alt="MS IE 5.0" title="MS IE 5.0"><img src="../../src/op512.gif" width="30" height="30" alt="Opera 5.12" title="Opera 5.12"><img src="../../src/ffox1.gif" width="30" height="30" alt="Mozilla Firefox 1" title="Mozilla Firefox 1"><img src="../../src/konq31.gif" width="30" height="30" alt="Konqueror 3.1" title="Konqueror 3.1"><img src="../../src/saf1.gif" width="30" height="30" alt="Safari 1.0" title="Safari 1.0"> <a class="an" name="quelltext">Quelltext mit Erluterungen</a></h2>
<p>Das Beispiel ist so konstruiert, dass es auf eine Variable zugreift, die zunchst noch gar nicht existiert. Das wrde zu einem Fehler fhren. Das Script "wei" jedoch, dass dieser Fehler auftreten kann und berprft deshalb mit dem <code>try..catch</code>-Statement laufend, ob die Variable schon existiert. Erst wenn die Variable existiert, wird die berwachung beendet.</p>
<h3 class="xmp">Beispiel:</h3>
<p><img src="../../src/dokf.gif" width="15" height="10" alt="Beispiel-Seite"> <a href="anzeige/fehlerbehandlung_try_catch.htm">Anzeigebeispiel: So sieht's aus</a></p>
<pre>
<html><head><title>Test</title>
<script type="text/javascript">
setTimeout("x=3", 200);
function zeigeErgebnis (Zaehler, Ergebnis) {
alert("Nach " + (Zaehler) + " Durchlufen existierte x.\nDie Zahl x ist " + Ergebnis + ".")
}
function teste_x (Zaehler) {
try {
if (x == 2) {
throw "richtig";
} else if (x == 3) {
throw "falsch";
}
} catch (e) {
if (e == "richtig") {
zeigeErgebnis(Zaehler, e);
return;
} else if (e == "falsch") {
zeigeErgebnis(Zaehler, e);
return;
}
} finally {
Zaehler++;
}
setTimeout("teste_x(" + Zaehler + ")", 30);
}
teste_x(0);
</script>
</head><body>
</body></html>
</pre>
<h3 class="xpl">Erluterung:</h3>
<p>Im Dateikopf der Datei ist ein Script-Bereich notiert. Darin werden die erste und die letzte Anweisung sofort beim Einlesen ausgefhrt. Die restlichen Anweisungen stehen in Funktionen.</p>
<h4>Die Variable x</h4>
<p>Whrend des Ladens der Datei wird eine Variable <code>x</code> zeitverzgert mit dem Wert <code>3</code> belegt. Dazu dient die Methode <img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="../objekte/window.htm#set_timeout">setTimeout()</a>. Die Variable ist also erst nach 200 Millisekunden verfgbar. Jeder Versuch, vorher auf diese Variable zuzugreifen, wrde zu einem Fehler fhren.</p>
<p>Die nchste Anweisung, die im Beispiel direkt ausgefhrt wird, ist die letzte im Script-Bereich, nmlich <code>teste_x(0)</code>. Damit wird die <img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="../sprache/funktionen.htm">Funktion</a> <code>teste_x()</code> aufgerufen, die oberhalb notiert ist.</p>
<h4>Die Funktion teste_x()</h4>
<p>Diese Funktion versucht, auf die Variable <code>x</code> zugreifen. Da zum Zeitpunkt des Aufrufes der Funktion jedoch noch nicht sicher ist, ob die Variable <code>x</code> bereits existiert, ist innerhalb der Funktion zur Vermeidung von Fehlermeldungen das <code>try..catch</code>-Statement notiert.<br>
Beim Aufruf erhlt die Funktion <code>teste_x()</code> einen Parameter namens <code>Zaehler</code> bergeben. Das dient im Beispiel zu Kontrollzwecken.</p>
<h4>Aufbau des <code>try..catch</code>-Statements</h4>
<p>Das <code>try..catch</code>-Statement hat generell folgenden Aufbau: Nach dem Schlsselwort <code>try</code> (<i>try = versuchen</i>) wird eine ffnende geschweifte Klammer, gefolgt von der zu prfenden <img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="../sprache/bedingt.htm">Bedingung</a>, notiert. Je nach Erfordernissen knnen Sie dann mit <code>throw</code> (<i>throw = auswerfen</i>) eigene Fehler definieren. Die <code>throw</code>-Definition ist jedoch optional. Anschlieend folgt eine schlieende geschweifte Klammer, die den <code>try</code>-Block beendet.<br>
Daran anschlieend notieren Sie das Schlsselwort <code>catch</code> (<i>catch = abfangen</i>). <code>catch</code> hat Funktions-Charakter und erwartet einen Parameter <code>e</code>. Die Variable <code>e</code> ist erforderlich, da Sie ber diese Variable letztlich die Reaktion des Scripts auf den aktuellen Zustand kontrollieren. Den Namen der Variablen knnen Sie frei whlen (der Name muss also nicht <code>e</code> sein). Innerhalb des Funktionsblocks von <code>catch()</code>, der wie blich in geschweiften Klammern steht, knnen Sie die mit <code>throw</code> definierten Fehler auswerten und darauf reagieren.<br>
Zuletzt knnen Sie noch das Schlsselwort <code>finally</code> notieren. In dem davon abhngigen Anweisungsblock knnen Sie weitere Anweisungen notieren. Diese Anweisungen werden unabhngig von der Fehlerbehandlung in jedem Fall ausgefhrt.</p>
<h4>Anwendung des <code>try..catch</code>-Statements im Beispiel</h4>
<p>Im ersten Teil der Anweisung wird geprft, ob die Variable <code>x</code> den Wert 2 oder 3 besitzt. Je nach Ergebnis werden mit <code>throw</code> verschiedene Fehlerwerte definiert. Hat <code>x</code> den Wert 2, so wird der "Fehler" mit dem Wert <code>richtig</code> generiert. Hat sie den Wert 3 so erhlt der Fehler den Wert <code>falsch</code>. Weitere Fehlervarianten werden nicht behandelt.</p>
<p>Im ersten Durchlauf existiert die Variable <code>x</code> im Beispiel noch gar nicht, da sie ja erst nach 200 Millisekunden existiert. Sie kann damit weder den Wert 2 noch den Wert 3 besitzen. In der nachfolgenden Fehlerbehandlungsroutine <code>catch(e)</code> wird geprft, ob einer der definierten Fehler, also <code>richtig</code> oder <code>falsch</code>, aufgetreten ist. Zunchst ist das offensichtlich nicht der Fall. Die Anweisungen, die von den "Fehlerwerten" <code>richtig</code> und <code>falsch</code> abhngig sind, werden deshalb nicht ausgefhrt. Die <code>finally</code>-Anweisung wird dagegen in jedem Fall ausgefhrt. Sie bewirkt im Beispiel, dass der bergebene Parameter <code>Zaehler</code> um 1 erhht wird.</p>
<h4>Gesamtkontrolle</h4>
<p>Am Ende ruft sich die Funktion <code>teste_x()</code> mit <code>setTimeout()</code> um 30 Millisekunden zeitverzgert selbst wieder auf. So behlt sie die Kontrolle ber das Geschehen, bis ein definierter Zustand eintritt. Der Parameter Zaehler wird dabei mit Hilfe einer <img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="../sprache/operatoren.htm#zeichenkettenverknuepfung">Zeichenkettenverknpfung</a> bergeben.</p>
<p>Interessant wird es, wenn der Zeitpunkt erreicht ist, zu dem die Variable <code>x</code> existiert. In diesem Fall tritt einer der vordefinierten Flle ein. Da <code>x</code> den Wert 3 besitzt, wird der <code>throw</code>-Fehler mit dem Wert <code>falsch</code> generiert (dies soll im Beispiel einfach zeigen, dass <code>throw</code> zur Erzeugung von Werten gedacht ist, die durchaus und oft auch Fehlerzustnde bezeichnen). Im nachfolgenden <code>catch(e)</code>-Block fhrt dies dazu, dass die Funktion <code>zeigeErgebnis()</code> aufgerufen wird. Im Beispiel wird fr beide definierten <code>throw</code>-Werte die gleiche Funktion aufgerufen. Sie knnen an dieser Stelle jedoch auch vllig verschiedene Anweisungen notieren. Jede dieser Fehlerbehandlungsroutinen bricht gleichzeitig die Funktion <code>teste_x()</code> mit <code>return</code> ab, da <code>x</code> ja nun existiert und der "kritische Zustand" beendet ist.</p>
<h4>Ausgabe des Ergebnisses</h4>
<p>Die Funktion <code>zeigeErgebnis()</code> erhlt als Parameter die Variablen <code>Zaehler</code> und <code>Ergebnis</code> bergeben. In der Variablen <code>Zaehler</code> ist die Anzahl der Durchlufe bis zur Existenz der Variablen <code>x</code> gespeichert und in der Variablen <code>Ergebnis</code> das Resultat der Fehlerbehandlung. Mit <code>alert()</code> wird im Beispiel zur Kontrolle ausgegeben, wie viele Durchlufe bentigt wurden und was fr ein Ergebnis erreicht wurde.</p>
<p>Die Ausgabe zeigt brigens sehr deutlich, wie unterschiedlich die Browser mit <code>setTimeout()</code> umgehen. Whrend Internet Explorer 6 und Netscape 6 bei Tests im Schnitt sieben Durchlufe bentigten, brauchten Opera 8.5 und Firefox 1.5 durchschnittlich drei.</p>
<h4>Anwendungsflle</h4>
<p>Prfungen mit dem <code>try..catch</code>-Statement sind z.B. dann sinnvoll, wenn Sie wie im Beispiel mit <code>setTimeout()</code> zeitversetzte Aktionen ausfhren und davon abhngige Anweisungen ausfhren wollen. Ebenfalls sinnvoll ist das Statement, wenn Sie z.B. auf Variablen oder Funktionen zugreifen wollen, die in anderen Frame-Fenstern notiert sind, wobei das Script nicht wissen kann, ob die Datei im anderen Frame-Fenster, in der das entsprechende Script notiert ist, bereits eingelesen oder berhaupt die dort aktuell angezeigte Seite ist.</p>
<table cellpadding="4" cellspacing="0" border="0" width="100%">
<tr><td colspan="2" class="doc">
<a href="#top"><img src="../../src/up.gif" width="14" height="10" border="0" alt="nach oben"></a>
</td></tr>
<tr><td class="doc"><a href="fensterueberwachen.htm"><img src="../../src/next.gif" width="10" height="10" border="0" hspace="10" alt="weiter"></a></td>
<td width="100%"><img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="fensterueberwachen.htm">nderungen der Fenstergre berwachen</a>
</td></tr>
<tr>
<td class="doc"><a href="fehlerbehandlung.htm"><img src="../../src/prev.gif" width="10" height="10" border="0" hspace="10" alt="zurck"></a></td>
<td><img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="fehlerbehandlung.htm">Fehlerbehandlung mit dem Event-Handler onerror</a>
</td>
</tr>
<tr><td colspan="2" class="doc"> </td>
</tr>
<tr>
<td colspan="2" class="nav"><a class="an" name="bottom"><img src="../../src/refkap.gif" width="16" height="13" alt="Teil von"></a> <a href="../../index.htm">SELFHTML</a>/<a href="../../navigation/index.htm" target="_parent" class="navh">Navigationshilfen</a> <img src="../../src/refkap.gif" width="16" height="13" alt="Teil von"> <a href="../index.htm">JavaScript/DOM</a> <img src="../../src/refkap.gif" width="16" height="13" alt="Teil von"> <a href="index.htm">Anwendungsbeispiele</a></td>
</tr>
</table>
<p>© 2007 <img src="../../src/dok.gif" width="15" height="10" alt="Seite"> <a href="../../editorial/impressum.htm">Impressum</a></p>
</body>
</html>
|