Излишен ли е SystemException?

+4 гласа
42 прегледа
попитан 2016 април 8 в .NET от Nikola.Nikolov. (3,100 точки)

Смятам че включването на ApplicationException в йерархията на exception-ите е излишен ход. 

По същия начин, смятам че няма причина да наследяваме exception-ите в приложенията директно от SystemException и да се използва Exception като цяло за тази цел. Мога да си представя обстоятелства, при които наследяването на ArgumentException или IOException може да е добра идея, особено като се имплементират вече съществуващи и документирани интерфейси около тях. Обаче, наследяването директно от SystemException в кода на приложението ми изглежда като много бъркващ еквивалент на наследяването на Exception, отчасти защото нямам представя какво точно представлява SystemException(в момента,а не попринцип.) 

Според MSDN: "Serves as the base class for system exceptions namespace. ... This class is provided as a means to differentiate between system exceptions and application exceptions." Колко завъртяно определение. Класът служи за разграничаване на типовете, които го наследяват, от типовете, които не го наследяват. 

Цялото разграничение между exception-ите в приложния и системния код ми се струва остаряло, особено в случаите на dependency injection, когато catch клаузите или документираните конвенции съществуват доста преди местата,в които се хвърля exception. Има тонове добре написан код, който хвърля exception-и,наследени от SystemException. 

Прав ли съм като смятам, че смисъла за съществуването на SystemException, ако изобщо има такъв, изчезна заедно със замирането на ApplicationExceptionАко този тип изведнъж изчезне от йерархията и неговите наследници станат наследници директно на Exception, ще има ли нарушени принципи на SOLID? 

1 отговор

+1 глас
отговорени 2016 април 9 от valeri.hristov (7,340 точки)
избран 2016 април 13 от Mitko Vasilev
 
Най-добър отговор
Първоначалното намерение очевидно е било да се разделят exception-ите на такива,които възникват в системата и такива, които възникват в приложението. Това разграничение очевидно не е особено полезно, тъй като тези exception-и се обработват еднакво. В крайна сметка,всички exception-и възникват,защото нещо в приложението се случва, системата не ги хвърля просто от само себе си.

Когато ApplicationException остаря, остаря и SystemException, но има доста exception-и, които ги наследяват и премахването им ще бъде драстична промяна. Може да има приложения, които ги използват и е по-добре да си останат така, вместо да се рискува тези приложения да спрат да работят.

Да се определят exception-ите по това къде са хвърлени не е много полезно за обработката на грешки. Може да е по-полезно да ги определяш по това как могат да се обработят. Например може да искаш базов клас за грешки, които могат да се оправят чрез повтаряне на процеса, и клас за грешки, които не могат да се оправят. Това може да се използва в обработката на грешки, за да ги обработваш по различен начин.
...