Expresión try…catch en JavaScript

try...catch en JavaScript
try…catch JavaScript

Una expresión try…catch en javascript se usa para probar una sección de expresiones y especifica una forma de manejar las excepciones si se lanzan.

Características generales

Estructura try catch en javascript

try {
   try_statements
}
[catch (exception_var_1) {
   catch_statements_1
}]
...
[catch (exception_var_2) {
   catch_statements_2
}]
[finally {
   finally_statements
}]

try_statements

Expresiones que se ejecutarán y que podrían generar una excepción.

catch_statements_1 y catch_statements_2

Expresiones que se ejecutarán si se lanza una excepción en try.

exception_var_1 y exception_var_2

Un identificador que se utiliza para almacenar el valor del objeto de excepción asociado con catch.

finally_statements

Expresiones que se ejecutarán después de que se complete una ejecución try, y estas expresiones se ejecutarán tanto si se lanza una excepción como si no.

Una expresión try consiste en una sección que contiene una o más expresiones (los corchetes deben usarse {}incluso si la sección consiste en una expresión), y debe contener al menos una catch sección o sección finally. Esto significa que hay tres formas de expresiones try en javascript:

  • try…catch
  • try…finally
  • try…catch…finally

Una sección catch contiene expresiones que especifican qué hacer cuando se lanza una excepción en una sección try en javascript. Es decir, queremos que la ejecución de expresiones programáticas en una sección sea try exitosa, y si su implementación no es exitosa, queremos transferir el control a una sección catch. Si cualquier expresión (o función llamada) en una sección try arroja una excepción, entonces el control se transfiere directamente a una sección catch, y si no ocurre ninguna excepción en una sección, una sección se try salta por completo catch.

La sección finally se llevará a cabo después de la puesta en práctica del Departamento try‘s catch pero antes de los términos de programación que sigue try. Siempre se implementará tanto si se lanza una excepción como si no.

Puede anidar expresiones try entre sí y, si la expresión try interna no tiene una sección catch adecuada, se utiliza una sección catch para la expresión try principal. Tenga en cuenta que puede usarse try para manejar excepciones lanzadas por JavaScript, así como excepciones privadas lanzadas por el usuario.

Secciones catch no policiales

Cuando en una sola partición se usa incondicionalmente catch, la ejecución del programa se moverá a esa partición cada vez que se produzca una excepción. Por ejemplo, cuando ocurre una excepción en el siguiente código, el control se transferirá directamente a una sección catch:

try {
   throw 'myException';  // generar una excepción 
} 
catch (e) { 
   // Expresiones necesarias para manejar la excepción 
   logMyErrors(e);  // registra la información del objeto de excepción 
}

Una sección especifica un catch identificador (su nombre e en el ejemplo anterior) que contiene el valor arrojado por una expresión throw. Tenga en cuenta que JavaScript crea un identificador cuando se ingresa una partición catch y lo pone a disposición del ámbito local y ese identificador permanecerá disponible hasta el final de una partición y catch no estará disponible posteriormente.

Condicionales catch

Las expresiones condicionales se pueden usar if...else dentro de una sección para catch probar si se cumple una condición específica del objeto Exception. En el siguiente ejemplo, probaremos si la excepción lanzada es de tipo TypeError OR RangeErrorEvalError:

try {
    myroutine();  // Esta función puede lanzar una excepción de cualquier tipo </em>
} catch (e) {
    if (e instanceof TypeError) {
        // ...
    } else if (e instanceof RangeError) {
        // ...
    } else if (e instanceof EvalError) {
        // ...
    } else {
       // ...
       logMyErrors(e);
    }
}

ID de excepción

Cuando se lanza una excepción en una sección tryexception_var(por ejemplo, ecatch (e)) mantendrá el valor especificado por la expresión throw, y puede usar este identificador para obtener información sobre la excepción que se lanzó.

Tenga en cuenta que este identificador es local, es decir, se creó al ingresar a la partición catchy no estará disponible una vez que la partición haya terminado de ejecutarse catch.

Sección finally

Una sección que finally contiene las expresiones que se ejecutarán después de la sección trycatch, pero antes de las expresiones que la siguen; Tenga en cuenta que una sección finally se ejecutará tanto si se lanza la excepción como si no, y si se lanza una excepción, las expresiones de una sección se ejecutarán tanto si la excepción se finally gestiona catch como si no. Puede utilizar una sección finally para ajustar la ejecución del script cuando se produce una excepción, como cerrar los recursos que ha utilizado el script …

Ya sea que haya una excepción o no, puede resultarle sorprendente que haya una sección que implemente modismos; pero esta sección tiene un propósito útil e importante. Es posible que el código que sigue a una expresión tryno se ejecute si no se maneja la excepción. Entonces, si ponemos un código de bloqueo de recursos en él, es posible que no siempre se ejecute, pero si lo colocamos en una sección, finally siempre se ejecutará.

El siguiente ejemplo abrirá un archivo en el disco duro y luego usará una función dentro de una partición para try escribir en él (recuerde que JavaScript puede usarse en el lado del servidor, lo que significa que se puede acceder a archivos locales). Si ocurre una excepción y el archivo está abierto, las expresiones en la sección del finally archivo se cerrarán antes de que el script termine de ejecutarse:

openMyFile();
try {
   // reservar el recurso 
   writeMyFile(theData);
}
finally {
   closeMyFile(); // cierra el recurso de todos modos 
}

Ejemplos y aplicaciones en código

A continuación, se muestra un ejemplo de una expresión try con finally solo la sección, contenida dentro de una expresión try con catch solo la sección :

try {
  try {
    throw new Error('oops');
  }
  finally {
    console.log('finally');
  }
}
catch (ex) {
  console.error('outer', ex.message);
}
// salida 
// "finalmente" 
// "exterior" "oops"

Si agregamos la partición catcha la expresión try interna para manejar la excepción:

try {
  try {
    throw new Error('oops');
  }
  catch (ex) {
    console.error('inner', ex.message);
  }
  finally {
    console.log('finally');
  }
}
catch (ex) {
  console.error('outer', ex.message);
}
// salida
// "interior" "oops" 
// "finalmente"

Tenga en cuenta que cualquier excepción se manejará una vez a través de la sección más cercana catch a ella, a menos que se rechace (por expresión throw), es decir, si aparece alguna excepción fuera de la expresión try interna , será manejada por la sección catch externa.

Devolver valores sección finally

Si se devuelve un valor dentro de una sección, finally el valor final se devolverá de try...catch...finally toda la sección, independientemente de las expresiones return presentes en las secciones trycatch:

(function() {
  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);
  }
})();
// salida 
// "interior" "oops" 
// "finalmente"

Soporte de navegadores

CaracterísticaChromeFirefoxIEOperaSafari
Soporte básico