Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 291948 of try...catch

  • Enlace amigable (slug) de la revisión: Guía_JavaScript_1.5/Sentencias_de_manejo_de_excepciones/try...catch
  • Título de la revisión: try...catch
  • Id de la revisión: 291948
  • Creada:
  • Creador: DSN XP
  • ¿Es la revisión actual? No
  • Comentario /* El bloque <code>finally</code> */

Contenido de la revisión

Sentencia try...catch

La sentencia try...catch marca un bloque de las instrucciones a probar y especifica una o más respuestas al producirse una excepción. La sentencia try...catch es la que se ocupa de la excepción.

La sentencia try...catch consiste de un bloque try, el cual contiene una o más sentencias y cero o más bloques catch, conteniendo sentencias que especifican que hacer si una excepción es lanzada en el bloque a probar {{mediawiki.external('try block')}}. Esto es, si desea que el bloque try suceda y si este no sucede, desea controlar el paso al bloque catch. Si cualquier sentencia dentro de un bloque try (o en una función llamada dentro de el bloque try) lanza una excepción, el control immediatamente cambia al bloque catch. Si no sucede el lanzamiento de ninguna excepción en el bloque try, el bloque catch es saltado. El bloque finally se ejecuta después de los bloques try y los bloques catch se ejecutan pero antes de las sentecias seguidas de la sentencia try...catch.

El ejemplo siguiente usa una sentencia try...catch. el ejemplo invoca una función que recupera un nombre de mes desde un arreglo basado en los valores pasados a la función. Sí el valor no corresponde a un número de mes (1-12), una excepción es lanzada con el valor InvalidMonthNo y las sentencias en el bloque catch configuran la variable monthName a desconocido {{mediawiki.external('<code>unknown</code>')}}.

function encuentraNombredelMes (mes) {
    mes=mes-1; // Ajusta el número del mes por el índice de lista (1=Enero, 12=Diciembre)
    var meses=new Array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
    if (meses[mes] != null) {
       return meses[mes]
    } else {
       throw "NombredelMesInválido"
    }
}

try {
// instrucciones a probar
    NombredelMes =encuentraNombredelMes (miMes) // funció que podría lanza una excepción
}
catch (e) {
    NombredelMes ="desconocido"
    logMisErrores(e) // pasa el objeto excepción al manejador de errores
}

El bloque catch

Puede utilizar un solo bloque catch para manipular todas las excepciones que pueden ser generadas en el bloque try, o puede utilizar bloques separados catch cada uno de los cuales manipula un tipo particular de excepción.

Un solo bloque de captura
Utilize un solo bloque catch de sentencias try...catch(bloque de recuperación) para ejecutar un código manejador de errores para cualquier excepción lanzada en el bloque try.

Un solo bloque catch tiene la siguiente sintáxis:

catch (catchID) {
  sentencias
}

El bloque catch especifica un identificador (catchID en la sintáxis anterior) que mantiene el valor especificado por la sentencia throw; puede utilizar este identificador para obtener información acerca de la excepción que fue lanzada. JavaScript crea este identificador cuando el bloque catch es ingresado; el identificador dura solamente lo que dure el bloque catch; después de que el bloque catch finalize la ejecución, el identificador no está más disponible.

Por ejemplo, el siguiente código lanza una excepción. Cuando la excepción ocurre, el control se transfiere al bloque catch.

try {
   throw "miExcepcion" // genera una excepción
}
catch (e) {
// sentencias para manipular cualquier excepción
   logMisErrores(e) // pasa el objeto excepción al manipulador de errores
}

Múltiples bloques de captura
Una sola sentencia try puede contener múltiples bloques catch condicionales, cada uno de los cuales manipula un tipo específico de excepción. en este caso, el bloque condicional catch apropiado es ingresado solamene cuando la excepción especificada para ese bloque es lanzada. Puede también incluir un bloque opcional catch-all catch enla sentencia para todas la excepciones no especificadas como un bloque final de captura {{mediawiki.external('final catch block')}}.

Por ejemplo, la siguiente función invoca otras tres funciones (declaradas en cualquier lugar), las cuales validan sus argumentos. Si una función de validación determina que el componente que está siendo chequeado es inválido, este retorna 0, causando que el lanzador lanze una excepción particular.

function getCustInfo(name, id, email)
{
   var n, i, e;

   if (!validate_name(name))
       throw "InvalidNameException"
   else
       n = name;
       if (!validate_id(id))
          throw "InvalidIdException"
       else
          i = id;
       if (!validate_email(email))
          throw "InvalidEmailException"
       else
          e = email;
       cust = (n + " " + i + " " + e);
       return (cust);
}

Los bloques condicionales catch rutean el control al manejador de excepciones apropiado.

try {
// función que debería lanzar tres excepciones
   getCustInfo("Lee", 1234, "[email protected]")
}

catch (e if e == "InvalidNameException") {
// invocar al manejador para nombres inválidos
   bad_name_handler(e)
}

catch (e if e == "InvalidIdException") {
// invocar al manejador para ids inválidos
   bad_id_handler(e)
}

catch (e if e == "InvalidEmailException") {
// invocar al manejador para direcciones e-mail inválidas
   bad_email_handler(e)
}

catch (e){
// No se que hacer pero lo registro en un log
   logError(e)
}

El bloque finally

El bloque finally contiene sentencias para ejecutar después de que se ejecuten los bloques {{mediawiki.external('try y catch')}} pero antes de las sentencias seguidas de la sentencia try...catch. El bloque finally se ejecuta sin importar que una excepción sea lanzada o no. Si una excepción es lanzada, las sentencias en el bloque finally se ejecutan aún si los manejadores de bloques no capturan la excepción.

Puede utiizar el bloque finally para hacer que su script falle graciosamente cuando ocurra una excepción, por ejemplo, puede necesiar liberar un recurso que su script il gracefully when an exception occurs; for example, you may need to release a resource that your script has tied up. The following example opens a file and then executes statements that use the file (server-side JavaScript allows you to access files). If an exception is thrown while the file is open, the finally block closes the file before the script fails.

openMyFile();
try {
   writeMyFile(theData); //This may throw a error
}catch(e){
   handleError(e); // If we got a error we handle it
}finally {
   closeMyFile(); // always close the resource
}

Sentencia try...catch anidada

You can nest one or more try...catch statements. If an inner try...catch statement does not have a catch block, the enclosing try...catch statement's catch block is checked for a match.

{{template.AnteriorSiguiente("Guía_JavaScript_1.5:Sentencias_de_manejo_de_excepciones:throw", "Guía_JavaScript_1.5:Definiendo_Funciones")}}


Categorías

enlaces interwikis
{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Guide/Exception_Handling_Statements/try...catch_Statement", "fr": "fr/Guide_JavaScript_1.5/Instructions_de_gestion_d\'exceptions/L\'instruction_try...catch", "ja": "ja/Core_JavaScript_1.5_Guide/Exception_Handling_Statements/try...catch_Statement", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Instrukcje_obs\u0142ugi_wyj\u0105tk\u00f3w/Instrukcja_try...catch" } ) }}

Fuente de la revisión

<div class="noinclude"></div>
<h3 name="Sentencia_try...catch"> Sentencia try...catch </h3>
<p>La sentencia <code>try...catch</code> marca un bloque de las instrucciones a probar y especifica una o más respuestas al producirse una excepción. La sentencia <code>try...catch</code> es la que se ocupa de la excepción.
</p><p>La sentencia <code>try...catch</code> consiste de un bloque <code>try</code>, el cual contiene una o más sentencias y cero o más bloques <code>catch</code>, conteniendo sentencias que especifican que hacer si una excepción es lanzada en el bloque a probar {{mediawiki.external('try block')}}. Esto es, si desea que el bloque <code>try</code> suceda y si este no sucede, desea controlar el paso al bloque <code>catch</code>. Si cualquier sentencia dentro de un bloque <code>try</code> (o en una función llamada dentro de el bloque <code>try</code>) lanza una excepción, el control immediatamente cambia al bloque <code>catch</code>. Si no sucede el lanzamiento de ninguna excepción en el bloque <code>try</code>, el bloque <code>catch</code> es saltado. El bloque <code>finally</code> se ejecuta después de los bloques <code>try</code> y los bloques <code>catch</code> se ejecutan pero antes de las sentecias seguidas de la sentencia <code>try...catch</code>.
</p><p>El ejemplo siguiente usa una sentencia <code>try...catch</code>. el ejemplo invoca una función que recupera un nombre de mes desde un arreglo basado en los valores pasados a la función. Sí el valor no corresponde a un número de mes (1-12), una excepción es lanzada con el valor <code>InvalidMonthNo</code> y las sentencias en el bloque <code>catch</code> configuran la variable <code>monthName</code> a desconocido {{mediawiki.external('&lt;code&gt;unknown&lt;/code&gt;')}}.
</p>
<pre>function encuentraNombredelMes (mes) {
    mes=mes-1; // Ajusta el número del mes por el índice de lista (1=Enero, 12=Diciembre)
    var meses=new Array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
    if (meses[mes] != null) {
       return meses[mes]
    } else {
       throw "NombredelMesInválido"
    }
}

try {
// instrucciones a probar
    NombredelMes =encuentraNombredelMes (miMes) // funció que podría lanza una excepción
}
catch (e) {
    NombredelMes ="desconocido"
    logMisErrores(e) // pasa el objeto excepción al manejador de errores
}
</pre>
<h4 name="El_bloque_catch"> El bloque <code>catch</code> </h4>
<p>Puede utilizar un solo bloque <code>catch</code> para manipular todas las excepciones que pueden ser generadas en el bloque <code>try</code>, o puede utilizar bloques separados <code>catch</code> cada uno de los cuales manipula un tipo particular de excepción.
</p><p><b>Un solo bloque de captura</b><br>
Utilize un solo bloque <code>catch</code> de sentencias <code>try...catch</code>(bloque de recuperación) para ejecutar un código manejador de errores para cualquier excepción lanzada en el bloque <code>try</code>.
</p><p>Un solo bloque <code>catch</code> tiene la siguiente sintáxis:
</p>
<pre>catch (catchID) {
  sentencias
}
</pre>
<p>El bloque <code>catch</code> especifica un identificador (<code>catchID</code> en la sintáxis anterior) que mantiene el valor especificado por la sentencia <code>throw</code>; puede utilizar este identificador para obtener información acerca de la excepción que fue lanzada. JavaScript crea este identificador cuando el bloque <code>catch</code> es ingresado; el identificador dura solamente lo que dure el bloque <code>catch</code>; después de que el bloque <code>catch</code> finalize la ejecución, el identificador no está más disponible.
</p><p>Por ejemplo, el siguiente código lanza una excepción. Cuando la excepción ocurre, el control se transfiere al bloque <code>catch</code>.
</p>
<pre>try {
   throw "miExcepcion" // genera una excepción
}
catch (e) {
// sentencias para manipular cualquier excepción
   logMisErrores(e) // pasa el objeto excepción al manipulador de errores
}
</pre>
<p><b>Múltiples bloques de captura</b><br>
Una sola sentencia <code>try</code> puede contener múltiples bloques <code>catch</code> condicionales, cada uno de los cuales manipula un tipo específico de excepción. en este caso, el bloque condicional <code>catch</code> apropiado es ingresado solamene cuando la excepción especificada para ese bloque es lanzada. Puede también incluir un bloque opcional <code>catch-all catch</code> enla sentencia para todas la excepciones no especificadas como un bloque final de captura {{mediawiki.external('final catch block')}}.
</p><p>Por ejemplo, la siguiente función invoca otras tres funciones (declaradas en cualquier lugar), las cuales validan sus argumentos. Si una función de validación determina que el componente que está siendo chequeado es inválido, este retorna 0, causando que el lanzador lanze una excepción particular.
</p>
<pre>function getCustInfo(name, id, email)
{
   var n, i, e;

   if (!validate_name(name))
       throw "InvalidNameException"
   else
       n = name;
       if (!validate_id(id))
          throw "InvalidIdException"
       else
          i = id;
       if (!validate_email(email))
          throw "InvalidEmailException"
       else
          e = email;
       cust = (n + " " + i + " " + e);
       return (cust);
}
</pre>
<p>Los bloques condicionales <code>catch</code> rutean el control al manejador de excepciones apropiado.
</p>
<pre>try {
// función que debería lanzar tres excepciones
   getCustInfo("Lee", 1234, "[email protected]")
}

catch (e if e == "InvalidNameException") {
// invocar al manejador para nombres inválidos
   bad_name_handler(e)
}

catch (e if e == "InvalidIdException") {
// invocar al manejador para ids inválidos
   bad_id_handler(e)
}

catch (e if e == "InvalidEmailException") {
// invocar al manejador para direcciones e-mail inválidas
   bad_email_handler(e)
}

catch (e){
// No se que hacer pero lo registro en un log
   logError(e)
}
</pre>
<h4 name="El_bloque_finally"> El bloque <code>finally</code> </h4>
<p>El bloque <code>finally</code> contiene sentencias para ejecutar después de que se ejecuten los bloques {{mediawiki.external('try y catch')}} pero antes de las sentencias seguidas de la sentencia <code>try...catch</code>. El bloque <code>finally</code> se ejecuta sin importar que una excepción sea lanzada o no. Si una excepción es lanzada, las sentencias en el bloque <code>finally</code> se ejecutan aún si los manejadores de bloques no capturan la excepción.
</p><p>Puede utiizar el bloque <code>finally</code> para hacer que su script falle graciosamente cuando ocurra una excepción, por ejemplo, puede necesiar liberar un recurso que su script il gracefully when an exception occurs; for example, you may need to release a resource that your script has tied up. The following example opens a file and then executes statements that use the file (server-side JavaScript allows you to access files). If an exception is thrown while the file is open, the <code>finally</code> block closes the file before the script fails.
</p>
<pre>openMyFile();
try {
   writeMyFile(theData); //This may throw a error
}catch(e){
   handleError(e); // If we got a error we handle it
}finally {
   closeMyFile(); // always close the resource
}
</pre>
<h4 name="Sentencia_try...catch_anidada"> Sentencia try...catch anidada</h4>
<p>You can nest one or more <code>try...catch</code> statements. If an inner <code>try...catch</code> statement does not have a catch block, the enclosing <code>try...catch</code> statement's catch block is checked for a match.
</p>
<div class="noinclude">
<p>{{template.AnteriorSiguiente("Guía_JavaScript_1.5:Sentencias_de_manejo_de_excepciones:throw", "Guía_JavaScript_1.5:Definiendo_Funciones")}}
</p><p><br>
<span class="comment">Categorías</span>
</p>
<span class="comment">enlaces interwikis</span></div>
{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Guide/Exception_Handling_Statements/try...catch_Statement", "fr": "fr/Guide_JavaScript_1.5/Instructions_de_gestion_d\'exceptions/L\'instruction_try...catch", "ja": "ja/Core_JavaScript_1.5_Guide/Exception_Handling_Statements/try...catch_Statement", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Instrukcje_obs\u0142ugi_wyj\u0105tk\u00f3w/Instrukcja_try...catch" } ) }}
Revertir a esta revisión