Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Experiment: Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.

try...catch

BaselineWidely available

Dietry...catch-Anweisung besteht aus einemtry-Block und entweder einemcatch-Block, einemfinally-Block oder beiden. Der Code imtry-Block wird zuerst ausgeführt, und wenn er eine Ausnahme wirft, wird der Code imcatch-Block ausgeführt. Der Code imfinally-Block wird immer ausgeführt, bevor der Kontrollfluss die gesamte Konstruktion verlässt.

Probieren Sie es aus

try {  nonExistentFunction();} catch (error) {  console.error(error);  // Expected output: ReferenceError: nonExistentFunction is not defined  // (Note: the exact output may be browser-dependent)}

Syntax

js
try {  tryStatements} catch (exceptionVar) {  catchStatements} finally {  finallyStatements}
tryStatements

Die Anweisungen, die ausgeführt werden sollen.

catchStatements

Anweisung, die ausgeführt wird, wenn imtry-Block eine Ausnahme ausgelöst wird.

exceptionVarOptional

Ein optionalerIdentifier oder ein Muster, um die gefangene Ausnahme für den zugehörigencatch-Block zu halten. Wenn dercatch-Block den Wert der Ausnahme nicht verwendet, können SieexceptionVar und seine umgebenden Klammern weglassen.

finallyStatements

Anweisungen, die ausgeführt werden, bevor der Kontrollfluss dietry...catch...finally-Konstruktion verlässt. Diese Anweisungen werden ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst oder gefangen wurde.

Beschreibung

Dietry-Anweisung beginnt immer mit einemtry-Block. Dann muss eincatch-Block oder einfinally-Block vorhanden sein. Es ist auch möglich, sowohlcatch- als auchfinally-Blöcke zu haben. Dies gibt uns drei Formen für dietry-Anweisung:

  • try...catch
  • try...finally
  • try...catch...finally

Im Gegensatz zu anderen Konstruktionen wieif oderfor müssen dietry,catch undfinally-BlöckeBlöcke und keine einzelnen Anweisungen sein.

js
try doSomething(); // SyntaxErrorcatch (e) console.log(e);

Eincatch-Block enthält Anweisungen, die angeben, was zu tun ist, wenn imtry-Block eine Ausnahme ausgelöst wird. Wenn eine Anweisung imtry-Block (oder in einer Funktion, die aus demtry-Block aufgerufen wird) eine Ausnahme auslöst, wird der Kontrollfluss sofort auf dencatch-Block verlagert. Wenn imtry-Block keine Ausnahme ausgelöst wird, wird dercatch-Block übersprungen.

Derfinally-Block wird immer ausgeführt, bevor der Kontrollfluss dietry...catch...finally-Konstruktion verlässt. Er wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst oder gefangen wurde.

Sie können ein oder mehreretry-Anweisungen verschachteln. Wenn eine inneretry-Anweisung keinencatch-Block hat, wird dercatch-Block der umschließendentry-Anweisung stattdessen verwendet.

Sie können dietry-Anweisung auch verwenden, um JavaScript-Ausnahmen zu behandeln. Weitere Informationen zu JavaScript-Ausnahmen finden Sie imJavaScript-Leitfaden.

Catch-Bindung

Wenn imtry-Block eine Ausnahme ausgelöst wird, hältexceptionVar (d.h. dase incatch (e)) den Ausnahme-Wert. Sie können dieseBindung verwenden, um Informationen über die ausgelöste Ausnahme zu erhalten. DieseBindung ist nur imGültigkeitsbereich descatch-Blocks verfügbar.

Es muss kein einzelner Bezeichner sein. Sie können einDestrukturierungsmuster verwenden, um mehrere Bezeichner gleichzeitig zuzuweisen.

js
try {  throw new TypeError("oops");} catch ({ name, message }) {  console.log(name); // "TypeError"  console.log(message); // "oops"}

Die durch diecatch-Klausel erstellten Bindungen existieren im selben Gültigkeitsbereich wie dercatch-Block, daher können imcatch-Block deklarierte Variablen nicht denselben Namen wie die durch diecatch-Klausel erstellten Bindungen haben. (Es gibteine Ausnahme von dieser Regel, aber es handelt sich um eine veraltete Syntax.)

js
try {  throw new TypeError("oops");} catch ({ name, message }) {  var name; // SyntaxError: Identifier 'name' has already been declared  let message; // SyntaxError: Identifier 'message' has already been declared}

Die Ausnahmebindung ist beschreibbar. Beispielsweise könnten Sie den Ausnahme-Wert normalisieren, um sicherzustellen, dass es sich um einError-Objekt handelt.

js
try {  throw "Oops; this is not an Error object";} catch (e) {  if (!(e instanceof Error)) {    e = new Error(e);  }  console.error(e.message);}

Wenn Sie den Ausnahme-Wert nicht benötigen, können Sie ihn zusammen mit den umschließenden Klammern weglassen.

js
function isValidJSON(text) {  try {    JSON.parse(text);    return true;  } catch {    return false;  }}

Der finally-Block

Derfinally-Block enthält Anweisungen, die nach der Ausführung destry-Blocks undcatch-Blocks ausgeführt werden, jedoch vor den Anweisungen, die demtry...catch...finally-Block folgen. Der Kontrollfluss wird denfinally-Block immer betreten, was auf eine der folgenden Weisen geschehen kann:

  • Unmittelbar nachdem dertry-Block die Ausführung normal beendet hat (und keine Ausnahmen wurden ausgelöst);
  • Unmittelbar nachdem dercatch-Block die Ausführung normal beendet hat;
  • Unmittelbar bevor die Ausführung einer Kontrollflussanweisung (return,throw,break,continue) imtry-Block odercatch-Block erfolgt, die den Block verlassen würde.

Wenn eine Ausnahme aus demtry-Block ausgelöst wird, selbst wenn keincatch-Block vorhanden ist, um die Ausnahme zu behandeln, wird derfinally-Block trotzdem ausgeführt, wobei die Ausnahme sofort nach dem Abschluss desfinally-Blocks erneut ausgelöst wird.

Das folgende Beispiel zeigt einen Anwendungsfall für denfinally-Block. Der Code öffnet eine Datei und führt dann Anweisungen aus, die die Datei verwenden; derfinally-Block stellt sicher, dass die Datei immer geschlossen wird, nachdem sie verwendet wurde, selbst wenn eine Ausnahme ausgelöst wurde.

js
openMyFile();try {  // tie up a resource  writeMyFile(theData);} finally {  closeMyFile(); // always close the resource}

Kontrollflussanweisungen (return,throw,break,continue) imfinally-Block werden jeden Abschlusswert destry-Blocks odercatch-Blocks "maskieren". In diesem Beispiel versucht dertry-Block, 1 zurückzugeben, aber bevor die Rückgabe erfolgt, wird der Kontrollfluss zuerst demfinally-Block zugeführt, sodass der Rückgabewert desfinally-Blocks stattdessen zurückgegeben wird.

js
function doIt() {  try {    return 1;  } finally {    return 2;  }}doIt(); // returns 2

Es ist generell eine schlechte Idee, Kontrollflussanweisungen imfinally-Block zu verwenden. Verwenden Sie ihn nur für Bereinigungscode.

Beispiele

Unbedingter Catch-Block

Wenn eincatch-Block verwendet wird, wird dercatch-Block ausgeführt, wenn eine Ausnahme von innerhalb destry-Blocks ausgelöst wird. Beispielsweise, wenn die Ausnahme im folgenden Code auftritt, wird der Kontrollfluss auf dencatch-Block übertragen.

js
try {  throw new Error("My exception"); // generates an exception} catch (e) {  // statements to handle any exceptions  logMyErrors(e); // pass exception object to error handler}

Dercatch-Block gibt einen Bezeichner an (e im obigen Beispiel), der den Wert der Ausnahme hält; dieser Wert ist nur imGültigkeitsbereich descatch-Blocks verfügbar.

Bedingte Catch-Blöcke

Sie können "Bedingtecatch-Blöcke" erstellen, indem Sietry...catch-Blöcke mitif...else if...else-Strukturen kombinieren, wie folgt:

js
try {  myRoutine(); // may throw three types of exceptions} catch (e) {  if (e instanceof TypeError) {    // statements to handle TypeError exceptions  } else if (e instanceof RangeError) {    // statements to handle RangeError exceptions  } else if (e instanceof EvalError) {    // statements to handle EvalError exceptions  } else {    // statements to handle any unspecified exceptions    logMyErrors(e); // pass exception object to error handler  }}

Ein häufiger Anwendungsfall besteht darin, nur eine kleine Teilmenge der erwarteten Fehler zu erfassen (und zu unterdrücken) und den Fehler in anderen Fällen erneut auszulösen:

js
try {  myRoutine();} catch (e) {  if (e instanceof RangeError) {    // statements to handle this very common expected error  } else {    throw e; // re-throw the error unchanged  }}

Dies kann die Syntax aus anderen Sprachen wie Java nachahmen:

java
try {  myRoutine();} catch (RangeError e) {  // statements to handle this very common expected error}// Other errors are implicitly re-thrown

Verschachtelte Try-Blöcke

Zuerst, sehen wir, was in diesem Fall passiert:

js
try {  try {    throw new Error("oops");  } finally {    console.log("finally");  }} catch (ex) {  console.error("outer", ex.message);}// Logs:// "finally"// "outer" "oops"

Nun, wenn wir die Ausnahme bereits im innerentry-Block gefangen haben, indem wir einencatch-Block hinzufügen:

js
try {  try {    throw new Error("oops");  } catch (ex) {    console.error("inner", ex.message);  } finally {    console.log("finally");  }} catch (ex) {  console.error("outer", ex.message);}// Logs:// "inner" "oops"// "finally"

Und jetzt werfen wir den Fehler erneut.

js
try {  try {    throw new Error("oops");  } catch (ex) {    console.error("inner", ex.message);    throw ex;  } finally {    console.log("finally");  }} catch (ex) {  console.error("outer", ex.message);}// Logs:// "inner" "oops"// "finally"// "outer" "oops"

Eine gegebene Ausnahme wird nur einmal von dem nächstgelegenen umschließendencatch-Block gefangen, es sei denn, sie wird erneut ausgelöst. Natürlich werden alle neuen Ausnahmen, die im "inneren" Block ausgelöst werden (weil der Code imcatch-Block etwas tun kann, das ein Auslösen verursacht), vom "äußeren" Block gefangen.

Rückgabe aus einem Finally-Block

Wenn derfinally-Block einen Wert zurückgibt, wird dieser Wert zum Rückgabewert der gesamtentry-catch-finally-Anweisung, unabhängig von allenreturn-Anweisungen in dentry undcatch-Blöcken. Dies schließt Ausnahmen ein, die innerhalb descatch-Blocks ausgelöst werden:

js
(() => {  try {    try {      throw new Error("oops");    } catch (ex) {      console.error("inner", ex.message);      throw ex;    } finally {      console.log("finally");      return;    }  } catch (ex) {    console.error("outer", ex.message);  }})();// Logs:// "inner" "oops"// "finally"

Der äußere "oops" wird nicht ausgelöst, weil die Rückgabe imfinally-Block erfolgt. Dasselbe gilt für jeden Wert, der vomcatch-Block zurückgegeben wird.

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-try-statement

Browser-Kompatibilität

Siehe auch

MDN-Feedback-Box

Diese Seite wurde automatisch aus dem Englischen übersetzt.


[8]ページ先頭

©2009-2025 Movatter.jp