Мое приложение на Boost версии 1.46.1.
Я хочу портировать свое приложение на Boost версии 1.58.0.
Однако я сталкиваюсь с некоторыми проблемами.
Я заметил, что Boost 1.58 имеет другую реализацию boost::exception_ptr
от 1.46.1. В 1.46.1, boost::exception_ptr
был реализован как разделяемый указатель:
typedef shared_ptr<exception_detail::clone_base const> exception_ptr;
где, как и в 1.58, вся реализация была инкапсулирована внутри класса.
class exception_ptr {
typedef boost::shared_ptr<exception_detail::clone_base const> impl;
impl ptr_;
friend void rethrow_exception(exception_ptr const &);
typedef exception_detail::clone_base const *(impl::*unspecified_bool_type)() const;
public:
exception_ptr() {}
explicit exception_ptr(impl const &ptr) : ptr_(ptr) {}
bool operator==(exception_ptr const &other) const { return ptr_ == other.ptr_; }
bool operator!=(exception_ptr const &other) const { return ptr_ != other.ptr_; }
operator unspecified_bool_type() const { return ptr_ ? &impl::get : 0; }
};
Из-за этих изменений мой код ломается … 🙁
boost::exception_ptr ExceptionHelper::GetExceptionPtr(MyExceptionPtr_t exception) {
boost::exception_ptr result =
boost::dynamic_pointer_cast<boost::exception_detail::clone_base const>(exception); // This is giving build error
return result;
}
MyExceptionPtr_t ExceptionHelper::TryGetMyExceptionPtr(boost::exception_ptr exception) {
MyExceptionPtr_t result;
boost::shared_ptr<const Exception> constPtr =
boost::dynamic_pointer_cast<const Exception>(exception); // This is giving build error.
if (constPtr) {
result = boost::const_pointer_cast<Exception>(constPtr);
}
return result;
}
std::string ExceptionHelper::GetThrowFilename(const boost::exception_ptr exception) {
std::string result;
if (exception) {
if (boost::get_error_info<boost::throw_file>(*exception)) // This is giving build error.
{
result = *boost::get_error_info<boost::throw_file>(*exception);
}
}
return result;
}
Не могли бы вы подсказать мне, как исправить вышеуказанные ошибки ??
Спасибо
boost::exception_ptr
по умолчанию: конструируемый, копируемый, назначаемый и сопоставимый по равенству. Ни одна из этих операций не позволяет вам извлечь захваченное исключение. Никакие другие операции не указаны в самом классе. Это не изменилось с 1.46.1 до 1.58.0; единственное отличие состоит в том, что реализация была изменена, поэтому сложнее случайно использовать функции boost::exception_ptr
которые не являются частью указанного интерфейса (как ваш код).
Возможны только другие операции:
template <class T>
exception_ptr copy_exception( T const & e );
exception_ptr current_exception();
void rethrow_exception( exception_ptr const & ep );
rethrow_exception
это функция, которую вы хотите здесь. Чтобы извлечь данные из exception_ptr
, сбросьте его, а затем обработайте данные в блоке catch (это соответствует модели, используемой для std::exception_ptr
, поэтому вам не придется вносить дальнейшие изменения, когда вы в конечном итоге перейдете к компилятору, который поддерживает C ++ 11):
std::string ExceptionHelper::GetThrowFilename(
const boost::exception_ptr exception)
{
std::string result;
if (!exception) return result;
try {
boost::rethrow_exception(exception);
}
catch (boost::exception const &e) {
boost::throw_file::value_type const *throw_file_data =
boost::get_error_info<boost::throw_file>(e)
if (throw_file_data) {
result = *throw_file_data;
}
}
return result;
}
Я не знаю что MyExceptionPtr_t
для. Похоже, его можно заменить boost::exception_ptr
(и поэтому функции преобразования можно было бы сделать ненужными), но без всего кода мне трудно сказать наверняка.
Других решений пока нет …