2008-09-26 5 views

Respuesta

-1

Por el ejemplo dado, diría que fue una mala práctica. Sin embargo, hay casos en los que puede ser más eficiente para interceptar simplemente un error esperado. Validar el formato de una cadena antes de casting it as a GUID sería un buen ejemplo.

+0

sólo se aplica a los idiomas inflexible. No JavaScript – roosteronacid

1

Creo que si vas a atrapar la excepción, entonces haz algo con ella. De lo contrario, déjalo burbujear para que un nivel superior pueda manejarlo de alguna manera (incluso si es solo el navegador el que te informa el error).

2

Sí. Por un lado, una excepción podría arrojarse por cualquier cantidad de razones, además de perder argumentos. El catch-all escondería aquellos casos que probablemente no sean deseados.

4

Si espera una condición en particular, su código será más fácil de mantener si lo prueba explícitamente. Me gustaría escribir lo anterior como algo parecido a

if( myInfo && newInfo 
     && myInfo.person && newInfo.person 
     && myInfo.person.address && newInfo.person.address 
     && (myInfo.person.name == newInfo.person.name 
      && myInfo.person.address.street == newInfo.person.address.street 
      && myInfo.person.address.zip == newInfo.person.address.zip 
     ) 
) 
{ 
    this.setAddress(newInfo); 
} 

Esto hace que el efecto mucho más claro - por ejemplo, supongamos que se newInfo todos llenos, pero partes de MyInfo faltan? ¿Quizás realmente desee llamar a setAddress() en ese caso? Si es así, ¡tendrás que cambiar esa lógica!

1

En una nota relacionada, en IE, aunque las especificaciones dicen que puede, no puede usar una combinación try/finally. Para que su "finalmente" se ejecute, debe tener definido un bloque catch, incluso si está vacío.

//this will [NOT] do the reset in Internet Explorer 
try{ 
    doErrorProneAction(); 
} finally { 
    //clean up 
    this.reset(); 
} 

//this [WILL] do the reset in Internet Explorer 
try{ 
    doErrorProneAction(); 
} catch(ex){ 
    //do nothing 
} finally { 
    //clean up 
    this.reset(); 
} 
0

Siempre se puede escribir una función auxiliar para hacer la revisión para usted:

function pathEquals(obj1, obj2, path) 
{ 
    var properties = path.split("."); 
    for (var i = 0, l = properties.length; i < l; i++) 
    { 
     var property = properties[i]; 
     if (obj1 === null || typeof obj1[property] == "undefined" || 
      obj2 === null || typeof obj2[property] == "undefined") 
     { 
      return false; 
     } 

     obj1 = obj1[property]; 
     obj2 = obj2[property]; 
    } 

    return (obj1 === obj2); 
} 

if (pathEquals(myInfo, newInfo, "person.name") && 
    pathEquals(myInfo, newInfo, "person.address.street") && 
    pathEquals(myInfo, newInfo, "person.address.zip")) 
{ 
    this.setAddress(newInfo); 
} 
Cuestiones relacionadas