2012-01-24 20 views
14

Estoy empezando a aprender JavaScript, hasta ahora no hay problema pero me es difícil encontrar una buena explicación del mecanismo de excepción en JS.¿Cómo podría diferenciar entre los diferentes tipos de excepciones?

Parece que C++, JS permite lanzar sobre cada objeto, en lugar de arrojar un objeto Exception (probablemente debido a su naturaleza dinámica).

throw 'An error occured.'; 

obras, así como

throw new Exception('An error occured.'); 

catch y finally tanto parecen funcionar al igual que su equivalente en Java. Aún así, no sé cuáles son las mejores prácticas ampliamente aceptadas con respecto a las excepciones.

Así, por ejemplo, es de fiar a lanzar objetos de tipo cadena, como:

throw 'An error occured'; 

¿Cómo puedo diferenciar entre los diferentes tipos de excepciones?

+0

Tendrá que reducir su pregunta. Las mejores prácticas en términos de qué? –

Respuesta

12

Lanzar y atrapar excepciones es bastante caro, y con JavaScript, va a obtener excepciones principalmente en casos como cuando intenta analizar una cadena JSON malformada. Sugiero evitar try/catch tanto como sea posible y centrarme en buscar errores a la manera antigua (tipos de devolución, asegurándome de que las variables estén inicializadas correctamente antes de usarlos, etc.) ya que es menos probable que ocurran excepciones aquí que en C++ o especialmente Java o .NET.

Andy E's recommendation es una buena aplicación para manejarlas, pero en general, debe intentar escribir el código de JavaScript a la defensiva para que ni siquiera necesite try/catch. Recuerde, incluso JITed JavaScript en Chrome (el motor más rápido) sigue siendo lento en comparación con Java o C#, por no mencionar C++, por lo que todo lo que sea costoso en esos idiomas lo será aún más en JavaScript.

+0

+1, no se me ocurrió recomendar totalmente las declaraciones try/catch, aunque rara vez necesito escribir una. Una de las razones por las que podría necesitar un try/catch es cuando trata con objetos host (como 'ActiveXObjects 'de IE) que pueden no estar presentes o no pueden ser instanciados. –

15

La "mejor práctica", supongo, es arrojar el tipo correcto de objeto de error relacionado con el problema que causa la excepción. ECMAScript define varios tipos de objetos de excepción, todos los cuales heredan de Error. Estos objetos son EvalError, RangeError, ReferenceError, TypeError y URIError.

Esos constructores son utilizados por las funciones de ECMAScript nativos, lo que le permite hacer algo como esto:

try { 
    // do something 
} 
catch (e) { 
    if (e instanceof TypeError) { 
     // do something else 
    } 
} 

general, mediante la instrucción throw sin necesidad de utilizar un objeto de excepción que me llama la práctica como pobres por varias razones, incluyendo :

  • código diseñado para manejar excepciones pueden estar esperando un objeto Error, recibiendo una primitiva puede resultar en efectos secundarios inesperados o la incapacidad para controlar la excepción sin modificar el código de manejo. Un ejemplo de esto es la falta de una propiedad stack en el resultado de la expresión throw.
  • Cuando no se utiliza en una sentencia try/catch, Internet Exploradores 8 y más baja se producirá una excepción diferente en su intento de lanzar, con el mensaje, "excepción lanzada y no se detecta"*. Esto puede ser aún más confuso si está depurando utilizando las herramientas de desarrollador o tiene un manejador de excepción global establecido en window.onerror.

Por lo tanto, sí, en general se atienen a arrojar instancias correctamente Error o sus objetos heredados.

* nb, IE también lo hace para los tipos de objetos Error que no están construidos directamente desde Error. Sí, sé que es estúpido, pero lo arreglaron en IE 9 aunque me dijeron que era "por diseño".

+6

'throw ' es un patrón anti simplemente porque el error devuelto en 'catch' no tiene una propiedad' .stack' si no es una instancia 'Error' real y eso es puro RAGE. Como un lado, try/catch/throw es un patrón anti de rendimiento general en JS y debe evitarse siempre que sea posible. – Raynos

2

Si está creando una aplicación AJAX, las excepciones pueden no ser tan útiles.Debido a la naturaleza asíncrona de operaciones ajax, manejo de errores no funcionará como se puede esperar

function save_data(){ 
    try { 
     ajax(some_ulr, function(){ 
      //callback 
      do_wrong_thing(); 
     }); 
    } catch(e){ 
     handler_error(); 
    } 
} 

en el anterior fragmento de código, el error causado por do_wrong_thing sección de captura no se disparará.

+2

El código asíncrono también rompe el 'return', por lo que debería esperarse ... – hugomg

Cuestiones relacionadas