2008-10-13 8 views
6

debo utilizar este método de errores de lanzamiento:El uso adecuado de intentar coger ..

if (isset($this->dbfields[$var])) { 
    return $this->dbfields[$var]; 
} else { 
    throw new FieldNotFoundException($var); 
} 

o este estilo:

try { 
    return $this->dbfields[$var]; 
} catch (Exception $e) { 
    throw new FieldNotFoundException($var); 
} 

... o algo completamente distinto?

explicación rápida del código:$this->dbfields es una matriz. isset() comprueba si se establece una variable, en este caso, si el elemento de matriz existe.

+0

con el número 2 que en realidad no tienen para lanzar una excepción, solo imprime la que capturas. – Rayne

+0

y el error estándar de "matriz no existe" (que ni siquiera es una excepción, ahora que lo pienso), no tendría sentido en la forma en que estoy usando esto. – nickf

Respuesta

10

El segundo ejemplo es malo. Está tomando una gran cantidad de gastos generales para atrapar una excepción cuando, como lo demuestra, es igual de fácil prevenir la excepción en primer lugar. Además, también asume que sabe por qué se lanzó esa excepción: si hubo alguna otra excepción, como por ejemplo, memoria insuficiente o algo así, lo informa como un "campo no encontrado", incluso si no lo fue.

Tenga en cuenta que try/catch en idiomas como C++ y Java son muy caros debido a todo el estado que tienen que guardar y restaurar. Python, por otro lado, tiene excepciones muy económicas y lo alientan positivamente a que use un try/except para una validación simple. Pero aun así, atrapar todo y pretender que es un tipo de excepción sigue siendo malo.

+0

¡Me has vencido por 2 segundos! – Mark

+0

@Mark - es por eso que tengo más de 3500 XP; ¡Soy rápido en las respuestas obvias! :-) –

3

La captura de "Excepción" es no, la mayoría de las veces, considera una buena práctica, fuera de los dos se está visualizando, me gustaría utilizar la opción 1.

La captura todas las excepciones pueden ocultar una excepción diferente y enmascararlo como una FileNotFoundException.

+0

Debería considerar seriamente volver a redactar la primera oración. No creo que atrapar Exception NUNCA sea una buena práctica. MUY RARAMENTE tal vez, pero NUNCA NUNCA. –

+0

¡De acuerdo! Gracias Jason, estaba un poco apresurado – Mark

4
//First let's do the checks. 
if(!isset($this->dbfields[$var])) 
    throw new FieldNotFoundException($var); 
//Now we're in the clear! 
return $this->dbfields[$var]; 
+0

¿no es exactamente lo que era mi primer ejemplo? – nickf

+0

Está más claro, IMO. – Domenic

+0

Sería aún más claro sin comentarios :) –

2

prefiero la primera, pero si dbfields [$ var] arroja algo razonable cuando se accede a un elemento inexistente, entonces yo preferiría simplemente devolverlo sin comprobar.

No me gusta particularmente cambiar el tipo de excepción a menos que tenga un buen motivo; si lo hace, asegúrese de intentar conservar la excepción original y el seguimiento de la pila.

0

Simplemente vuelva a leer su explicación.

Supongo que su método allí en # 1 va a atrapar cualquier excepción que pueda lanzarse y simplemente devolverá un bool. Definitivamente no me gusta la captura de la excepción genérica la mayor parte del tiempo, por lo que el # 2 no sería mi elección.

0

"... ¿o algo completamente distinto?"

Ninguno es muy bueno, por lo que otra cosa sería apropiada.

Solucione la versión 2 para detectar la excepción correcta, no todas las excepciones posibles. Publique como opción 3. Renunciaré a algo que capte una excepción específica en lugar de Exception.

0

Esto está lejos de ser independiente del idioma.

Algunos idiomas no se generan errores para acceder a los campos inexistentes, y el patrón preferido depende mucho de las implementaciones de las matrices, tablas, objetos, etc.

Cuestiones relacionadas