Jeśli rzucanie System.Exceptionjest uważane za tak złe, dlaczego nie zostało Exceptionwykonaneabstract ?
W ten sposób nie będzie możliwe wywołanie:
throw new Exception("Error occurred.");
Wymusiłoby to użycie wyjątków pochodnych, aby podać więcej szczegółów na temat błędu, który wystąpił.
Na przykład, gdy chcę podać niestandardową hierarchię wyjątków dla biblioteki, zwykle deklaruję abstrakcyjną klasę bazową dla moich wyjątków:
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
A potem kilka wyjątków pochodnych o bardziej szczegółowym celu:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Następnie podczas wywoływania dowolnej metody bibliotecznej można mieć ten ogólny blok try / catch, aby bezpośrednio wychwycić dowolny błąd pochodzący z biblioteki:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
Czy to dobra praktyka?
Czy byłoby dobrze, gdyby Exceptionzostał streszczony?
EDYCJA: Chodzi mi o to, że nawet jeśli klasa wyjątku jest zaznaczona abstract, nadal możesz złapać ją w bloku catch-all. Uczynienie go abstrakcyjnym to tylko sposób, aby zabronić programistom zgłaszania wyjątku „super-szeroki”. Zwykle, kiedy dobrowolnie zgłaszasz wyjątek, powinieneś wiedzieć, jaki to typ i dlaczego tak się stało. Wymuszając w ten sposób wyrzucenie bardziej konkretnego typu wyjątku.