У меня есть API, внутри которого есть некоторые исключения для отчетов об ошибках. Базовая структура состоит в том, что у него есть корневой объект исключения, который наследуется от std::exception
, затем он выбрасывает некоторый подкласс этого.
Поскольку перехват исключения, генерируемого в одной библиотеке или потоке, и перехват его в другом может привести к неопределенному поведению (по крайней мере, Qt жалуется на это и запрещает его во многих контекстах). Я хотел бы обернуть вызовы библиотеки в функции, которые будут возвращать код состояния, а в случае возникновения исключения - копию объекта исключения.
Каков наилучший способ хранить исключение (с его полиморфным поведением) для последующего использования? Я считаю, что будущий API c ++ 0x использует что-то вроде этого. Так какой же самый лучший подход?
Лучшее, что я могу придумать, - это иметь clone()
метод в каждом классе исключений, который будет возвращать указатель на исключение того же типа. Но это не очень обобщенно и вообще не касается стандартных исключений.
Есть мысли?
EDIT : Похоже, что в c ++ 0x будет механизм для этого . Это описывается как "магия библиотеки". Означает ли это, что это не требует каких-либо особенностей языка c ++ 0x? если нет, есть ли реализации, совместимые с c ++ 03?
РЕДАКТИРОВАТЬ : похоже, в boost есть реализация копирования исключений . Я оставлю вопрос открытым для любых не boost::copy_exception
ответов.
РЕДАКТИРОВАТЬ : Чтобы устранить озабоченность j_random_hacker относительно основной причины исключения, являющегося ошибкой нехватки памяти. Для этой конкретной библиотеки и набора исключений это не так. Все исключения, полученные из корневого объекта исключения, представляют различные типы ошибок синтаксического анализа, вызванных неправильным пользовательским вводом. Связанные с памятью исключения просто вызовут выброс std::bad_alloc
, который рассматривается отдельно.