practices handling exceptions example error create catch best c# .net exception compiler-errors

c# - handling - ¿Por qué un tipo lanzado o capturado deriva de System.Exception?



exception message c# (5)

Así que solo por curiosidad quería ver qué tenía de especial la clase de excepción que permitía que se usara con la palabra clave Throw mientras que una clase estándar no lo es.

Todo lo que encontré es que la clase Excepción implementó lo siguiente

public class Exception : System.Object, System.Runtime.Serialization.ISerializable, System.Runtime.InteropServices._Exception { }

Así que intenté implementar esas mismas interfaces e intentar lanzar mi propia excepción personalizada que no se derivó de System.Exception en vano. Simplemente me aconsejaron que

El tipo capturado o lanzado debe derivarse de System.Exception

Entonces, ¿hay alguna razón específica para esto? Supongo que hay pocas opciones en los idiomas administrados que parecen ser arbitrarias.


Creo que tu premisa está equivocada. Es posible que se lance un objeto que no se derive de System.Exception . Simplemente no puede lanzarlo en C # o examinar el objeto en una cláusula catch. De la sección 8.10 de la especificación de C # (v4.0):

Algunos lenguajes de programación pueden admitir excepciones que no se pueden representar como un objeto derivado de System.Exception, aunque dichas excepciones nunca podrían generarse mediante el código C #. Se puede utilizar una cláusula de captura general para detectar dichas excepciones. Por lo tanto, una cláusula de captura general es semánticamente diferente de una que especifica el tipo de excepción System.Exception, ya que la primera también puede detectar excepciones de otros idiomas.

Un ejemplo de una captura general:

try { } catch (Exception) { } // ''specific'' catch catch { } // ''general'' catch

En particular, esto es importante cuando se llama a un código no administrado.

Algunos tipos siempre parecen recibir un tratamiento especial en todos los idiomas. Sobre todo porque son tan fundamentales para el sistema. System.Exception , System.ValueType , System.Delegate son todos tipos especiales en C # que están estrechamente vinculados a las palabras clave del lenguaje y al CLR, por lo que no es sorprendente que no pueda implementar clases que asuman sus funciones.


El lenguaje utiliza System.Exception como base para todas las excepciones. Básicamente, esto significa que cualquier excepción lanzable o capturable no debería cometer errores si lo hace (Exception)myExc . Esto probablemente se deba a que la definición de la clase System.Exception se usa para que todas las excepciones se adhieran a la misma interfaz. Debido a la interfaz consistente, las excepciones llegan con un seguimiento de pila y un mensaje significativo (por ejemplo), que es invaluable para el registro.


Es una elección arbitraria de los diseñadores del CLS. Presumiblemente hicieron esta elección por razones de consistencia. C # sigue el CLS; el compilador impone el requisito por este motivo, no por ningún motivo técnico relacionado con la implementación del tipo de excepción.

El CLI puede lanzar cualquier objeto. Consulte http://jilc.sourceforge.net/ecma_p3_cil.shtml#_Toc524462405 .


Una de las razones por las cuales cada excepción debe tener una clase base universal es para poder capturar cada tipo de excepción en un solo bloque catch.

Si tengo esto:

try { ... } catch(Exception ex) { // Handle somehow }

Eso capturará TODAS las excepciones y me permitirá mostrar lo que es (utilizando ex.Message ).

Si pudieras lanzar algo , entonces, ¿cómo tendrías una trampa que atraparía todo y aún así te daría acceso al objeto lanzado?

Podrías tener esto, que atrapará absolutamente todo:

try { ... } catch { // Handle somehow }

Pero has ''perdido'' lo que se tiró.


Pautas de diseño para excepciones

Las excepciones son el mecanismo estándar para reportar errores. Las aplicaciones y bibliotecas no deben usar códigos de retorno para comunicar errores. El uso de excepciones se agrega a un diseño de marco consistente y permite el informe de errores de los miembros, como los constructores, que no pueden tener un tipo de retorno

lanzar (C # Referencia)

La excepción lanzada es un objeto cuya clase se deriva de System.Exception, como se muestra en el siguiente ejemplo.

class MyException : System.Exception {} // ... throw new MyException();

Resumen de excepciones

En .NET Framework, una excepción es un objeto que se hereda de la clase de excepción.

Por lo tanto, su excepción debe derivarse de System.Exception , pero depende de usted, cómo la organiza dentro.