2010-11-05 9 views
5

¿Habría alguna diferencia si hago lo siguiente sin usar excepciones?¿Cuándo atrapar excepciones?

void func() 
{ 
    try 
    { 
     if (n > 5) 
     { 
      throw "n is greater than 5"; 
     } 
    } 
    catch (const char *e) 
    { 
     MessageBox(0, e, 0, 0); 
     return; 
    } 
} 

O

void func() 
{ 
    if (n > 5) 
    { 
     MessageBox(0, "n is greater than 5", "Error", 0); 
     return; 
    } 
} 
+1

te destrozarían por arrojar un 'char const *' en el primer caso. –

+0

Puede haber una diferencia en el título "Error" y en la ingeniería inversa de su código. . . – k06a

Respuesta

8

Probablemente diría que es mejor que no use excepciones para el control de flujo. Las excepciones, como su nombre lo indica, son para manejar circunstancias excepcionales. En el caso anterior, claramente estás esperando que n sea posiblemente> 5, por lo que no es realmente una circunstancia excepcional. Si su aplicación tiene una forma de abordar este caso, debe hacerlo de preferencia para generar una excepción.

Estoy seguro de que hay casos en que la lógica se cae pero, en general, creo que es una buena regla de oro.

Pero en términos técnicos no hay mucha diferencia (posiblemente el rendimiento si lo haces mucho).

0

No hay ninguna diferencia real en su ejemplo (aparte del hecho obvio que uno utiliza excepciones y el otro no!) - que sería una refactorización razonable. Sin embargo, si hay muchas condiciones de error diferentes, puede encontrar que el patrón throw... catch lo ayuda a mantener el manejo de errores en un solo lugar.

2

El resultado final sería exactamente el mismo, eso es seguro.

Debe intentar simplificar todo lo posible en el código, por lo que desaconsejo el uso de una excepción en este caso.

0

En su ejemplo, no hay diferencia. Lo único que tiene que averiguar es que cuando se lanza una excepción, el resto de las declaraciones indicaron que el método try ... catch nunca se ejecutará. Exceptions se usan básicamente para manejar "condiciones especiales que cambian el flujo normal de ejecución del programa". (el suyo es simplemente un flujo de error lógico normal).

Espero que esto ayude.

0
void func() 
{ 
    if (n > 5) 
    { 
     MessageBox(0, "n is greater than 5", "Error", 0); 
     return; 
    } 
} 

No arroje la excepción usted mismo, si puede manejarlo solo con un código como el anterior, no es una buena práctica.

2

Es muy difícil decir exactamente cuándo se deben usar excepciones. En algunos casos, las excepciones son el claro ganador, y en otros casos no lo son.

El núcleo de la pregunta es de dónde viene n, y puede ser, en circunstancias normales, un valor> 5. Si n se calcula por la función en sí y normalmente puede tener este valor, una excepción no lo hace sentirse bien. Sin embargo, si n se especifica en otra parte, y esta función simplemente no espera un valor alto, entonces una excepción parece más correcta.

Sin embargo, su ejemplo, diría que es un mal uso de las excepciones. Lanzar y atrapar una excepción dentro de la misma función es casi siempre una mala forma. Este es el control de flujo estándar. Se deben usar excepciones cuando una condición de error necesita propagarse fuera de la función.

3

Nunca arroje una excepción que luego capte en la misma función. Esa es una señal de que está utilizando excepciones para el flujo de control estándar, que se hace mejor con if/while/break/etc.

+1

¡Nunca digas nunca! :-) –

+0

@Alf: por lo general, nunca debes decir nunca. ¡Esta es la única excepción! :) –

+0

OK, entonces, una excepción a la excepción a la regla sobre lanzar y atrapar excepciones en la misma función basada en excepciones, es cuando emulas '' por '' estilo de excepción Java '' en C++. Aunque RAII en general será más limpio, supongo que puede haber alguna excepción a eso. Aclamaciones, –

0

No definió n.

Con la siguiente definición de n no es diferente comportamiento observable:.

struct Silly 
{ 
    ~Silly() { cout << "Hm de dum" << endl; } 
    operator bool() const { return true; } 
}; 

struct SillyProducer 
{ 
    Silly operator>(int) const { return Silly(); } 
}; 

#define n Silly silly = SillyProducer() 

Saludos & HTH,

0

Mucho se ha dicho ya, simplemente voy a añadir algo de mi lado.

En su caso ambos casos son correctos, excepto que recomendaría dividir esto en dos capas: lógica y vista. De modo que su capa de lógica haría:

doLogic() 
    { 
     if (n > 5) 
     { 
     throw "n is greater than 5"; 
     } 
     ///Something more 
    } 

y su capa de vista podría hacer:

try 
{ 
    doLogic() 
} 
catch (const char *e) 
{ 
    MessageBox(0, e, 0, 0); 
    return; 
} 

Pero una vez más, como otro dijo: lo más importante es de dónde viene el n venido. Si espera que sea más de 5, simplemente use if() else, no excepciones. Pero si n es siempre menos de 5 y si son más de 5 significa que algo está mal con su sistema, entonces use excepciones.

Cuestiones relacionadas