Винятки, що згенеровані в статичних конструкторах, Блог про шифрування
Якщо виняток згенеровано, а в стеку немає оброблювача, тому його пошук завершується в статичному конструкторі типу, виконуюча система обробляє цей випадок спеціальним чином. Вона транслює виняток у System. TypelnitializationException і генерує його замість початкового.
Перед генерацією нового виключення властивість InnerException екземпляра TypelnitializationException встановлюється у вихідний виняток. Таким чином, будь-який обробник виключення ініціалізації типу може легко виявити причину збою.
Така трансляція виключення має сенс, тому що конструктори за своєю природою не можуть повертати значення, що свідчить про успіх чи невдачу. Винятки - єдиний доступний механізм, що дозволяє сигналізувати про збій конструктора.
Що важливіше: оскільки система викликає статичні конструктори у визначений самої системою час, для них має сенс застосовувати тип TypelnitializationException, який дозволить точніше визначити, коли щось йде не так. Наприклад, припустимо, що є статичний конструктор, який може потенційно генерувати виняток ArgumentOutOfRangeException.
Тепер уявіть розчарування користувачів, якщо виняток пошириться в потоці, що включає, в деякий випадковий момент часу, оскільки точний момент виклику статичного конструктора визначається системою. Може здатися, що ArgumentOutOfRangeException матеріалізується буквально з нічого. Приміщення виключення в оболонку TypelnitializationException трохи прояснює ситуацію і попереджає користувачів, або, треба сподіватися, розробника, про те, що проблема виникла під час ініціалізації типу.
У наведеному нижчеКод демонструється приклад того, як виглядає TypelnitializationException з вкладеним усередині нього винятком:
Система може викликати статичні конструктори під час завантаження типу або перед зверненням до статичного члену, залежно від того, як налаштована CLR для поточного процесу.
В результаті запуску цього коду буде отримано наступний висновок:
Нерозповсюджений вираз: System.TypelnitializationException: Той тип ініціативи для ‘EventLogger1 threw an exception. -> System.NullReferenceException: Object reference not set to an instance of an object, at EventLogger..cctor() — End of inner exception stack trace — at EntryPoint.Main()
Зверніть увагу, що поряд із зазначенням того, що зовнішній виняток має тип TypelnitializationException, висновок також показує внутрішній виняток, з якого все почалося -NullRef erenceException.