Повторить поведение спецификаций исключений под VC++ 9.0

Я работаю над старым кодом, который сильно зависит от поведения спецификаций исключений, описанных в стандарте языка. А именно, вызовы std:: surprise () при нарушениях спецификации исключений описанной ниже формы.

foo() throw(T) { /*...*/ }

Спецификации Nothrow действительно гарантированно не выбросят, но ожидается, что бросочные (T) будут нарушены как по замыслу, так и... ну, потому что стандарт ожидает того же и предоставляет механизм для его обработки.

Причины этого связаны с решением разработчиков использовать EH также в качестве механизма обработки ошибок (контролируемого собственной иерархией классов ошибок) в дополнение к обработке исключений. Идиома, представленная в EH, тесно связана с их потребностями, и они пошли по пути наименьших усилий. Это, по крайней мере, то, как я это вижу, и меня это не особенно шокирует, учитывая размеры и сложность системы.

Однако теперь передо мной стоит включить новую и не связанную функциональность, и код работает не так, как ожидалось в VC++ 9.0, из-за отклонения от стандартов, касающихся спецификаций исключений, введенных в 8.0. (ссылка: Microsoft)

Я пытаюсь найти способ заставить стандартное поведение. Надеялся, что компилятор предложит запасной вариант. Но нет ни одного.

Мне не повезло, и мне нужно изменить правильно написанный стандартно-послушный код, работающий на 350000 строк кода, с полностью разработанной иерархией классов обработки ошибок? Или вы можете придумать способ, который поможет мне заставить поведение std:: непредвиденный ()?

РЕДАКТИРОВАТЬ: я предоставляю некоторую справочную информацию. Рассматриваемая система является Генератором Календарей Школьного Года для школы, в которой обучаются немногим более 4000 учеников, я не уверен в том, что некоторые цифры еще есть, 6 классов и ~190 классов, плюс 12 виртуальных (дистанционное обучение) классы. MINGW исключен, как и любой другой компилятор, кроме VC++ 8.0 или 9.0. Это связано с правилами, касающимися программного обеспечения, обслуживающего образовательную систему в этой стране.

Изменения, которые необходимо внести в код, предназначены именно для того, чтобы приспособить виртуальные классы к совершенно другой схеме для создания календаря. И тут я столкнулся с этой проблемой. Программное обеспечение интенсивно использует механизм исключений в нескольких частях процесса создания календаря в качестве средства управления рабочим процессом с помощью как неожиданных () сопоставлений (сохраненных и восстановленных), так и сопоставлений bad_exception, ни одно из которых не работает в VC++. С чисто личной точки зрения, я считаю, что механизм на самом деле очень элегантный, даже если он совершенно необычен. Но я отвлекся.

2 ответа

Решение

Как вы упомянули, Visual Studio имеет "интересный" способ работы со спецификациями исключений:

  • throw() имеет свое нормальное значение (функция не должна бросать)
  • все остальное (включая спецификацию исключений) интерпретируется как throw(...)

Нет способа обойти это. Тем не менее, сообщество C++ в значительной степени соглашается с тем, что спецификации исключений бесполезны. Вы действительно нуждаетесь в проверке типов ошибок? Возможно, правильное модульное тестирование может заменить ваши проверки во время выполнения.

Я не верю, что поведение спецификации исключений Visual C++ когда-либо (или утверждалось, что) соответствовало стандартам - даже до 8.0 - поэтому я не уверен, как работает приложение.

Возможно ли выполнить такие изменения, как:

void f() throw(T)
{
    // ...
}

чтобы:

void f()
{
    try
    {
        // ...
    }
    catch (T)
    {
        throw;
    }
    catch (...)
    {
        app_unexpected();
    }
}
Другие вопросы по тегам