Изключения, хвърлени в статични конструктори, блог за шифроване

Ако бъде хвърлено изключение и в стека няма манипулатор, така че търсенето завършва в статичния конструктор на типа, тогава средата за изпълнение обработва този случай по специален начин. Излъчва изключението към системата. TypeInitializationException и го хвърля вместо оригиналния.

Преди да бъде хвърлено ново изключение, свойството InnerException на екземпляра TypeInitializationException е зададено на оригиналното изключение. По този начин всеки манипулатор на изключения за инициализация на тип може лесно да открие причината за повредата.

Този превод на изключение има смисъл, тъй като конструкторите, поради самата си природа, не могат да върнат стойност, която показва успех или неуспех. Изключенията са единственият наличен механизъм за сигнализиране на грешка на конструктора.

По-важното е, че тъй като системата извиква статични конструктори в определено от системата време, има смисъл те да използват типа TypeInitializationException, който ще ви позволи по-точно да определите кога нещо се обърка. Да предположим например, че имате статичен конструктор, който потенциално може да хвърли ArgumentOutOfRangeException.

Сега си представете разочарованието на потребителя, ако изключението се разпространи в обхващащата нишка в някакъв случаен момент, тъй като точният момент, в който се извиква статичен конструктор, се определя от системата. Може да изглежда, че ArgumentOutOfRangeException буквално се материализира от нищото. Опаковането на изключението в TypeInitializationException изчиства малко нещата и предупреждава потребителите или, надяваме се, разработчика, че е възникнал проблем по време на инициализацията на типа.

По-долуКодът показва пример за това как изглежда TypeInitializationException с изключение, вложено в него:

Системата може да извика статични конструктори по време на зареждане на тип или точно преди достъп до статичен член, в зависимост от това как CLR е конфигуриран за текущия процес.

Изпълнението на този код ще доведе до следния резултат:

Необработено изключение: System.TypeInitializationException: Инициализаторът на типа за 'EventLogger1 хвърли изключение. —> System.NullReferenceException: Препратката към обект не е зададена към екземпляр на обект, при EventLogger..cctor() — Край на трасирането на стека на вътрешното изключение — при EntryPoint.Main()

Забележете, че заедно с посочването, че външното изключение е от тип TypeInitializationException, изходът показва и вътрешното изключение, което е започнало всичко,NullReferenceException.