2010-04-27 17 views
6

Escribo bastante código en Prototype.js que devuelve null si no se encontró un DOM-id.Captura de "NullPointerExceptions" en JavaScript

$("someId").show(); 

Si someId no existe, un método será llamado en nulo, lo que detiene el programa entero, en efecto incapacitante todos los efectos JS tras el error. Solo pude verificar el valor nulo antes de ejecutar tal afirmación, pero esto se está cansando.

Me gustaría detectar una excepción, pero no estoy seguro de cuál es. MDC enumera los siguientes tipos de errores ECMA Script, pero a primera vista ninguno de ellos parece ser lo que quiera:

* Error 
* EvalError 
* RangeError 
* ReferenceError 
* SyntaxError 
* TypeError 
* URIError 
* DOMException 
* EventException 
* RangeException 

También, los navegadores tienen una forma unificada de tratar con una llamada a un método en nulo?

+5

* Solo pude verificar el valor nulo antes de ejecutar tal afirmación, pero esto se está cansando. * ¿Eh? ¿Eres un desarrollador o no? Escribir un código robusto con cheques es una práctica normal y buena. – BalusC

+0

Buen punto, pero repetidamente anidado si las cláusulas hacen que mi código sea realmente ilegible. Debería haber dicho eso en vez de 'cansado'. –

+0

acepto responder si funciona para usted –

Respuesta

0

simplemente ignorar lo que es una excepción ...

try 
{ 
    null.hey() 
} 
catch(e) 
{ 
    //handle it here 
} 
2

no creo que hay unidad que se encuentran. Chrome lanza un TypeError, pero IE arroja un error, por lo que probablemente tenga que atrapar todo y hacer suposiciones graves. Es mejor verificar primero si es nulo.

var element = $('someId'); 
if (element) { 
    element.show(); 
    // whatever else... 
} 

Si element.show() es la única cosa que lo necesite para, a continuación, es obvio que se puede escribir mucho más corto, pero en la mayoría de los casos que serían apropiadas.

1

Si vas a la cadena. show() en $("someId") luego verifique su resultado primero.

if ($("someId")) 
    $("someId").show(); 

or 

$("someId") && $("someId").show(); 

or 

if (someVar = $("someId")) 
    someVar.show(); 

Si por alguna razón usted realmente necesita para identificarlos uno puede cerrar $() y lanzar una excepción personalizada:

function NullReferenceException(id) {this.id = id} 

function $my(id) { 
    var el = $(id); 
    if (!el) 
     throw new NullReferenceException(id); 
    return el 
} 

try { 
    $my("iDontExistId").show(); 
} catch (e) { 
    if (e instanceof NullReferenceException) 
     alert(e.id + " doesn't exist"); 
} 
1

La forma correcta de manejar esto es para comprobar nula antes de hacer algo con un objeto. Hay varias maneras de taquigrafía para hacer esto, es la más corta (como Alex K) escribió

$("someId") && $("someId").show(); 

pero esto me parece ser más difícil de leer.

Para responder a su pregunta directa que puede hacer

try { $('someId').show(); } catch (e) {} 

pero esto parece poco profesional. Debe programar explícitamente porque más tarde alguien no sabrá por qué escribió ese código impar. El primer ejemplo es ligeramente opaco, pero al menos contiene primero la prueba nula y no oculta los errores en el método show().

Por cierto, si estuviera usando jQuery en lugar de prototipo, este código funciona sin errores, incluso si no hay ningún objeto con id 'someId':

$('#someId').show() 

Esto se debe a la función $() en los retornos JQuery una colección que puede estar vacía pero nunca es nula.

+0

Me doy cuenta de esto y mi jefe insistió en Prototype. Me gusta pero este problema es realmente extraño. –

+0

+1 por mencionar cómo funciona en jQuery. –

Cuestiones relacionadas