Expresión throw en JavaScript

throw en JavaScript
Throw JavaScript

La expresión throw en javascript arroja una excepción definida por el usuario, esto hará que la función actual se detenga (es decir, las expresiones throw ya no se ejecutarán) y la ejecución pasará a la primera catch, y si no está, el programa terminará.

Características generales

La expresión throw se usa para lanzar una excepción en javascript, y cuando lanza una excepción, un valor expression especifica cuál es el valor de la excepción. Ejemplos:

throw 'Error2'; // genera una excepción con un valor de 
throw 42;      // 
throw true;   // Genera una excepción con un valor booleano

Tenga en cuenta que la expresión throw se ve afectada por la adición automática de punto y coma, por lo que no se puede colocar una línea en blanco entre la palabra reservada y la expresión throw.

Estructura throw javascript

throw expression;

expression

La expresión a lanzar.

Ejemplos y aplicaciones en código

Lanzar un objeto

Puede lanzar un objeto como una excepción, y luego puede referirse a las propiedades de ese objeto en una sección catch. Observe cómo creamos el objeto UserException en el siguiente ejemplo y luego lo lanzamos a través de la expresión throw:

function UserException(message) {
   this.message = message;
   this.name = 'UserException';
}
function getMonthName(mo) {
   mo = mo - 1; // (1 = Jan, 12 = Dec)
   var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
      'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException('InvalidMonthNo');
   }
}

try {
   var myMonth = 15;  // número fuera del rango 
   var monthName = getMonthName(myMonth);
} catch (e) {
   monthName = 'unknown';
   console.log(e.message, e.name);  // pasar el objeto a err 
}

Devolver un objeto

Este ejemplo prueba una cadena si coincide con el código postal de España. Y si la sintaxis no es válida, lanzará una excepción al crear un objeto de tipo ZipCodeFormatException:

/* 
* Crea un objeto ZipCode. 
* Sintaxis permitida para el código postal: 
* 12345 
* 12345-6789 
* 123456789 
* 12345 6789 
* Si la cadena pasada a la función 
* no coincide con uno de los patrones anteriores, se lanza una excepción 
*/
function ZipCode(zip) {
   zip = new String(zip);
   pattern = /[0-9]{5}([- ]?[0-9]{4})?/;
   if (pattern.test(zip)) {
      this.value = zip.match(pattern)[0];
      this.valueOf = function() {
         return this.value
      };
      this.toString = function() {
         return String(this.value)
      };
   } else {
      throw new ZipCodeFormatException(zip);
   }
}

function ZipCodeFormatException(value) {
   this.value = value;
   this.message = 'does not conform to the expected format for a zip code';
   this.toString = function() {
      return this.value + this.message;
   };
}
/* 
* Verifique el código postal 
* en las direcciones de España. 
*/

const ZIPCODE_INVALID = -1;
const ZIPCODE_UNKNOWN_ERROR = -2;

function verifyZipCode(z) {
   try {
      z = new ZipCode(z);
   } catch (e) {
      if (e instanceof ZipCodeFormatException) {
         return ZIPCODE_INVALID;
      } else {
         return ZIPCODE_UNKNOWN_ERROR;
      }
   }
   return z;
}

a = verifyZipCode(42040);         // 42040
b = verifyZipCode(4240);          // -1
c = verifyZipCode('a');           // -1
d = verifyZipCode('42040');       // 42040
e = verifyZipCode('42040 1234');  // 42040 1234

Devolver la excepción

Puede usar la expresión throw para devolver la excepción. En el siguiente ejemplo, intentaremos manejar una excepción con un valor numérico a través de la sección catch. Si el valor de esa excepción es mayor que 50, lo lanzaremos nuevamente para el función para manejar o para que el usuario vea:

try {
   throw n;  // lanzar una excepción tiene un valor numérico 
} catch (e) {
   if (e <= 50) {
      // expresiones de software para procesar el valor de 1-50
  } else { 
      // No podemos manejar la excepción, entonces le tiraremos 
      throw e;
   }
}

Soporte de navegadores

CaracterísticaChromeFirefoxIEOperaSafari
Soporte básico