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
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();
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.