Есть ли что-нибудь, что я могу сделать для обработки исключений в статических
время инициализации. Если нет, то почему? Почему нет чего-то в
язык, чтобы это разрешить?
C ++ не имеет четко определенных конструкций для пользовательских объектов, связанных внешне или созданных в области видимости файла. Как правило, это проблематично с такими проблемами, как неопределенный порядок инициализации. Без четкого определения того, что должно происходить в отношении таких вещей, как порядок инициализации, было бы трудно определить значимое поведение try / catch (куда можно поместить блок try / catch, например, если какой-либо объект, созданный в каком-либо модуле компиляции в система может скинуть?).
Для более философского ответа я бы рискнул предположить, что одной из проблем, на которые направлен C ++, является необходимость в большом количестве глобальных объектов. Язык не заботится о том, чтобы обеспечить им четко определенное поведение, поскольку их, как правило, следует избегать в первую очередь.
Если вам нужно быстрое решение, мы можем лениво конструировать вещи:
thing& my_thing()
{
static thing obj;
return obj;
}
Это гарантирует, что thing
не будет создан до тех пор, пока эта функция не будет впервые вызвана, что означает, что он не будет создан вне вашей основной точки входа, если у вас нет другого глобального объекта, который вызывает это (прямо или косвенно) через его конструктор.
В конечном итоге было бы лучше, если бы вы таким образом все вместе избегали глобальных экземпляров пользовательских типов, но если вы не можете устоять перед искушением, я рекомендую по крайней мере свободно применять форму ленивой инициализации.