El tipo de excepción permite a los controladores de la excepción filtrarlo. Si todo lo que lanzaste fueran excepciones del tipo Exception
, ¿cómo sabrían los manejadores qué excepciones capturar y cuáles para permitir la propagación de la pila de llamadas?
Por ejemplo, si siempre tirar Exception
:
void Foo(string item) {
try {
if (Bar(item)) {
Console.WriteLine("BAR!");
}
} catch (Exception e) {
Console.WriteLine("Something bad?");
}
}
bool Bar(string item) {
if (item == null) {
throw new Exception("Argument is null!");
}
return Int32.Parse(item) != 0;
}
¿Cómo la persona que llama Foo
saben si se ha producido una excepción nula o si el Int32.Parse()
fallidos? Tiene que verificar el tipo de la excepción lanzada (o hacer alguna comparación desagradable de cadenas).
Es aún más preocupante si se obtiene un ThreadAbortException
o OutOfMemoryException
que puede ocurrir en lugares que no se puede esperar una excepción. En estos casos, si su código de captura solo captura Exception
, puede enmascarar estas excepciones (importantes) y causar daños al estado de su programa (o sistema).
El código de ejemplo debe decir:
void Foo(string item) {
try {
if (Bar(item)) {
Console.WriteLine("BAR!");
}
} catch (ArgumentNullException ae) {
Console.WriteLine("Null strings cannot be passed!");
} catch (FormatException fe) {
Console.WriteLine("Please enter a valid integer!");
}
}
bool Bar(string item) {
if (item == null) {
throw new ArgumentNullException("item");
}
return Int32.Parse(item) != 0;
}
Como puede detectar excepciones específicas, puede tener varias declaraciones catch en un try ... catch block. – Nate
"¿Las subclases estándar que heredan de la clase de excepción base tienen métodos diferentes a los de la base?": Sí, pero la mayoría de las respuestas no se enfocaron en este punto. Consulte 'WebException' para obtener un ejemplo simple de esto: http://msdn.microsoft.com/en-us/library/system.net.webexception.aspx. Específicamente, tome nota de la propiedad 'Response'. – Brian