2012-05-22 2 views
1

У меня есть пользовательский класс исключения, который наследуется от boost::exception следующим образом:подклассов подталкивание исключение

class ConfigurationException : public boost::exception 
{ 
public: 
    ConfigurationException(const std::string & title, const std::string & message) { 
     QMessageBox box(QMessageBox::Critical, QString::fromStdString(title), QString::fromStdString(parse(message)), QMessageBox::Ok); 
     box.exec(); 
    } 
} 

и он может быть вызван из кода, как это:

try { 
    // Do some stuff here 
} catch (std::exception e) { 
    BOOST_THROW_EXCEPTION(ConfigurationException("Configuration Error", e.what())); 
} 

Однако, когда я пытаюсь скомпилировать , Я получаю ошибки

Libs\boost\include\boost/throw_exception.hpp(58): error C2664:'boost::throw_exception_assert_compatibility' : cannot convert parameter 1 from 'const ConfigurationException' to 'const std::exception &' 
      Reason: cannot convert from 'const ConfigurationException' to 'const std::exception' 
      No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
      Libs\boost\include\boost/throw_exception.hpp(85) : see reference to function template instantiation 'void boost::throw_exception<E>(const E &)' being compiled 
      with 
      [ 
       E=ConfigurationException 
      ] 
      src\ConfigurationReader.cpp(81) : see reference to function template instantiation 'void boost::exception_detail::throw_exception_<ConfigurationException>(const E &,const char *,const char *,int)' being compiled 
      with 
      [ 
       E=ConfigurationException 
      ] 

Я не совсем уверен, почему он пытается исключить мое исключение из std::exception. Может ли кто-нибудь сказать мне, как я могу выбросить это исключение и получить данные о файле, функции и т. Д.? (Я должен сказать, что, очевидно, throw ConfigurationException("some title", "some message"); работает отлично

ответ

2
  1. проистекает из обоего std::exception и boost::exceptionпрактически:.. struct ConfigurationException : virtual std::exception, virtual boost::exception
  2. улова константной ссылки:. catch (const std::exception& e)
  3. Не помещайте GUI логику в виде исключения (catch)
  4. Рассмотрите возможность использования error_info, чтобы приложить дополнительную информацию (например, ваше название и сообщение).

И вообще, будьте осторожны при смешивании Qt с исключениями.

+0

Спасибо за решение. Можете ли вы, возможно, остановиться на своем вопросе о смешении Qt с исключениями? Не могли бы вы предложить лучший способ развернуть сообщение, чтобы уведомить пользователя о поврежденном файле конфигурации? –

0

BOOST_THROW_EXCEPTION вызывает boost :: throw_exception, что требует, чтобы объект исключения получался из std :: exception (см. Www.boost.org/doc/libs/release/libs/exception/doc/throw_exception.html). Ошибка компиляции обеспечивает выполнение этого требования.

Другое дело, перехватить исключения по ссылке. Не поймайте (std :: exception e), catch (std :: exception & e).

Смежные вопросы