2012-08-15 21 views
9

He buscado una respuesta a mi pregunta pero no he podido encontrarla. Disculpas si la respuesta está ahí y estoy duplicando!Prueba/captura simple sin hacer uso de la excepción

sigo viendo código try/catch como .....

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

Lo que resultará en una advertencia ex no se usa nunca.

Así que mi pregunta es ... Aunque ex nunca se utiliza ¿hay algún beneficio en la declaración? Me dijeron que tal vez agrega detalles al rastro de la pila A veces veo catch (Exception) que detiene la advertencia, pero ¿qué beneficios trae esto, si hay alguno? Si tuviera que escribir esto y no utilizar la excepción de alguna manera yo no declarar ex ...

try 
{ 
    //Do whatever 
} 
catch 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

No es un gran problema, pero sería bueno saber con seguridad!

Gracias

Fred

+0

es probable que desee escribir la excepción real a un registro por lo que se puede depurar más tarde, incluso si nunca mostrarlo al usuario. – Rup

+0

Sí, si no está interesado en lo que salió mal (depende de usted) puede hacerlo si no declara la excepción – bizl

+0

, ya que puede tener varias 'atrapadas', puede escribir' catch (BadFormatException) {/ * formato incorrecto aquí * /} catch (Exception ex) {/ * error desconocido aquí * /} '. Creo que esa sería una razón para usar 'catch (Exception)' – Default

Respuesta

10

puede utilizar el siguiente patrón declarar todavía el tipo de excepción específica, sin una variable, para asegurar estructurado de excepciones de manipulación (SEH) sigue ocurriendo:

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
    MessageBox.Show("Oops, something went wrong in the IO!"); 
} 
catch (Exception) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

Esto no es una práctica que normalmente usaría, ya que probablemente registraría los detalles de la excepción si no la volvía a lanzar.

+0

No tenía idea de que pudiera detectar una excepción sin tener que asignarla a una variable (por ejemplo, "IOException ex") hasta que me encontré con esto. ¡Gracias! –

1

Puede utilizar ese ex variable para su uso posterior, incluyendo la tala, mensajería, etc.

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 

} 

Supongamos que desea registrar su excepción, para que luego el desarrollador puede echar un vistazo al registro y determinar qué salió mal. En ese caso, ex contendrá todos los detalles necesarios para el registro. p.ej. StackTrace, mensaje, si lo hay InnerException etc.

Para sus preguntas:

Aunque ex no se usa nunca hay ningún beneficio en la declaración?

Si no vas a utilizar, no hay beneficio en declararlo.

Me dijeron que tal vez se agrega detalles a la traza de la pila?

No estoy seguro, pero creo que no. Si define uno, eso contendrá el seguimiento de pila de la excepción, pero no le agregará nada.

A veces veo catch (Exception) que detiene la advertencia, pero ¿qué ventajas trae , si corresponde?

Si desea volver a emitir la excepción usando throw palabra clave, puede utilizar catch(Exception)

+0

Lo siento, quizás debería haber dicho. Entiendo por qué tendrías la declaración y los diferentes tipos de exceoptions que puedes atrapar. Lo que no sé es si hay algún beneficio para la declaración si no la va a usar. Me parece inútil, pero ¿hay algo que me falta? – Fred

0

No, no hay ningún punto en la declaración a menos que realmente se utilicen.

3

Suprimir excepciones suele ser de mala calidad ... que viajen por la pila.

En cuanto a "agrega detalles", vuelva a lanzar la excepción usando throw para conservar el seguimiento de la pila, de lo contrario perderá detalle. Una vez más, la alternativa está allí para no atraparlo en absoluto.Si no tiene ningún uso para la excepción (recuperación, desconexión, etc.), es probable que no haya una buena razón para atraparla.

Ver: What is the proper way to re-throw an exception in C#?

Ver también: "Back to Basics - Exceptions"

3

Es importante tener en cuenta que hay una diferencia en sus dos bloques de código publicado. catch (Exception ex) solo detectará las excepciones definidas por CLR (aquellas derivadas de Exception). catch solo capturará cualquier cosa, incluidas las excepciones no administradas que el CLR no ha capturado o envuelto.

Si se quiere evitar que su advertencia del compilador sin cambiar el comportamiento del código, o si desea recibir ningún aviso, mientras que todavía la captura de un tipo de excepción específica, puede utilizar esto en su lugar:

catch (Exception) 
{ 
} 

El El beneficio aquí es que puede ser específico: catch (SqlException), por ejemplo. Si no está utilizando la variable, entonces declare dar la advertencia, pero el comportamiento específico del tipo sigue siendo útil.

Independientemente, declarar que la excepción no agrega nada a la información (seguimiento de la pila o de otro modo), a menos que ajuste y/o vuelva a lanzar la excepción explícitamente. (Por cierto, no utilice throw ex volver a generar, porque esto hace perder información:. Sólo tiene que utilizar throw)

1

Si realmente no quiere hacer nada con excepción, también se puede hacer como lo que para evitar la advertencia del compilador:

catch (Exception) 
{ 
    // Stick our head in the sand 
} 

(or just catch)

1

Es todo sobre el desarrollador y su capacidad para poner en práctica adecuada de registro/depuración en un término más tarde ...

esto:

catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

se podría convertir fácilmente a

catch (Exception ex) 
{ 
    Log.Append(ex); 
    MessageBox.Show("Oops, something went wrong. Please check the Log file."); 
} 

a veces es simplemente allí para la depuración cuando se ejecuta línea por línea y puede tener un punto de interrupción en el MessageBox.Show línea y lea la variable ex.

Tiene su utilidad, pero, en el momento compilado, si no lo usa, obtendrá una advertencia que la variable ex es declarada y no se utiliza, por lo que, se puede realizar un seguimiento de todas las personas, y se seca Conectarse o eliminarlo

De nuevo, todo se trata de la elección del programador, y ... una variable no utilizada no es tan problemática en un programa final.

0

El Exception ex que será la referencia al objeto de excepción de tiempo de ejecución puede ofrecer múltiples ventajas. Usted mismo como desarrollador puede iniciar sesión en un archivo de texto o enviarse un informe a usted mismo.

A partir de la documentación de MSDN:

Si desea volver a emitir la excepción actualmente manejado por una cláusula catch sin parámetros, utilice la instrucción throw sin argumentos.

http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx

Cuestiones relacionadas