2010-02-18 31 views

Respuesta

4

Significa que el bloque catch capturará cualquier excepción.

También significa que no puede hacer nada con el objeto de excepción ya que no tiene una referencia al mismo.

Puede usar este patrón cuando realmente no le importa una posible excepción (y no desea hacer nada con ella), pero en general debe evitar este estilo.

2

Captura todas las excepciones atrapables. Usualmente es una mala idea.

1

Detectará todas las excepciones, pero no tendrá acceso al objeto de excepción en el bloque catch.

Esto puede ser útil para realizar alguna acción sobre cualquier error antes de volver a tirar.

+0

'Esto puede ser útil para realizar alguna acción en cualquier error antes de volver a tirar.' ¿No es eso lo que 'finalmente' hace? No impide ninguna excepción, pero le permite hacer un poco de manejo de todos modos. – Joren

+0

@Joren: Quiere decir más como manejar algo en un estado de error. P.ej. tal vez, si estás en un entorno de múltiples hilos, señala a los otros hilos para que pare porque se produjo un error. Normalmente no querrías hacer eso en un final. – Ian

+0

@Joren: @Ian lo tiene: una acción en caso de error, pero no en el retorno normal. – Richard

10

Es casi lo mismo que catch (Exception ex), si no está utilizando llamadas no administradas, porque todas las excepciones en .NET derivan de la clase Exception. Se utiliza cuando no necesita la instancia de Exception en su bloque catch. Pero catch sin Exception como parámetro capturará también las excepciones no administradas, porque en otros idiomas no administrados las excepciones no pueden derivarse de la clase Exception.

0

Aunque la cláusula catch se puede utilizar sin argumentos para detectar cualquier tipo de excepción, no se recomienda este uso. En general, solo debería detectar aquellas excepciones de las que sabe cómo recuperarse. Por lo tanto, siempre debe especificar un argumento de objeto derivado de System .. ::. Exception

0

Captura todas las excepciones y no tiene acceso a la misma excepción. Que, para mí, parece por lo general como un olor de código (hay algunas excepcionales los casos en que esto podría ser considerado aceptable)

siempre considero que es similar a la declaración On Error Resume Next en VB.

1

Existen dos tipos de excepciones: compatible con CLS, derivado de la clase Exception y no compatible con CLS (cuando se puede lanzar cualquier objeto - Int32, DateTime, etc.). catch cláusula sin excepción se usó antes .NET Framework 2.0 para capturar excepción que no cumple con CLS, pero ahora están atrapados y envueltos en RuntimeWrappedException con la propiedad WrappedException apuntando al objeto arrojado. Es por eso que dicho código debería evitarse en las versiones más nuevas de framework.

1

Antes que nada, un pequeño prólogo. El CLR permite que una instancia de cualquier tipo sea lanzada como una excepción; por ejemplo, es posible lanzar System.String o incluso System.Windows.Forms.Form objeto. Sin embargo, el compilador de C# permite lanzar solo objetos derivados de excepciones. Por lo tanto, la única forma de detectar excepciones que no cumplen con CLS es tener un bloque catch() vacío en su código.

Antes de la versión 2.0 de los bloques de captura no vacíos CLR (es decir, catch (Exception ...)) se contabilizaban únicamente las excepciones que cumplían con CLS. Pero en la versión 2.0 del CLR, Microsoft ha introducido una nueva clase RuntimeWrappedException de modo que cuando se lanza una excepción no compatible con CLS (desde otro idioma, por ejemplo), el CLR construye automáticamente una instancia de la clase RuntimeWrappedException. Desde entonces no hay necesidad de tener bloques catch vacíos (es decir, catch()) ya que catch (Exception) tomaría excepción de todos modos.

Espero que esto arroje algo de luz.

Para obtener más información, puedo dirigirme al gran libro de Jefrey Richter "CLR via C#", que se encuentra actualmente a la venta.

4

Significa que está tratando de atrapar excepciones que no cumplen con CLS.

Por lo que va mi entendimiento, En la versión 2.0 del CLR, cuando se lanza un no compatible con CLS excepción, el CLR crea automáticamente una instancia de la clase de excepciones RuntimeWrapped- e inicializa su ámbito privado para referirse al objeto que realmente fue arrojado. En efecto, CLR ahora convierte todas las excepciones que no cumplen con CLS en excepciones que cumplen con CLS.

Cuestiones relacionadas