Jeśli rzucanie System.Exception
jest uważane za tak złe, dlaczego nie zostało Exception
wykonaneabstract
?
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 Exception
został 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.