Exception
es el tipo base para todas las excepciones y, como tal, es terriblemente inespecífico. Nunca debería lanzar esta excepción porque simplemente no contiene ninguna información útil. Llamar a la captura de código para las excepciones no pudo eliminar la ambigüedad de la excepción lanzada intencionalmente (de su lógica) de otras excepciones del sistema que son completamente indeseables y señalan fallas reales.
La misma razón también se aplica a SystemException
. Si observa la lista de tipos derivados, puede ver una gran cantidad de otras excepciones con semánticas muy diferentes.
NullReferenceException
y IndexOutOfRangeException
son de un tipo diferente. Ahora bien, estas son excepciones muy específicas, por lo que lanzarlas podría estar bien. Sin embargo, todavía no querrás lanzarlos, ya que generalmente significan que hay algunos errores reales en tu lógica. Por ejemplo, la excepción de referencia nula significa que está intentando acceder a un miembro de un objeto que es null
. Si esa es una posibilidad en su código, entonces siempre debe buscar explícitamente null
y lanzar una excepción más útil en su lugar (por ejemplo ArgumentNullException
). De manera similar, IndexOutOfRangeException
los correos electrónicos ocurren cuando accede a un índice no válido (en matrices, no en listas). Siempre debe asegurarse de no hacer eso en primer lugar y verificar primero los límites de, por ejemplo, una matriz.
Hay algunas otras excepciones como esas dos, por ejemplo InvalidCastException
o DivideByZeroException
, que se lanzan por fallas específicas en su código y generalmente significan que está haciendo algo mal o que no está verificando primero algunos valores no válidos. Al arrojarlos a sabiendas de su código, solo está dificultando que el código de llamada determine si se lanzaron debido a alguna falla en el código, o simplemente porque decidió reutilizarlos para algo en su implementación.
Por supuesto, hay algunas excepciones (ja) a estas reglas. Si está creando algo que puede causar una excepción que coincida exactamente con una existente, no dude en usarlo, especialmente si está tratando de igualar algún comportamiento incorporado. Solo asegúrese de elegir un tipo de excepción muy específico.
Sin embargo, en general, a menos que encuentre una excepción (específica) que satisfaga sus necesidades, siempre debe considerar la posibilidad de crear sus propios tipos de excepción para excepciones esperadas específicas. Especialmente cuando está escribiendo código de biblioteca, esto puede ser muy útil para separar las fuentes de excepción.