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");(明らかに、それはうまく機能すると言うべきです。

4

2 に答える 2

2
  1. std::exceptionboost::exception virtualの両方から派生しますstruct ConfigurationException : virtual std::exception, virtual boost::exception
  2. const 参照によるキャッチ: catch (const std::exception& e).
  3. GUI ロジックを例外コンストラクターに配置しないでください。例外ハンドラー (つまりcatchブロック) に入れます。
  4. error_info追加情報 (タイトルやメッセージなど) を添付するために使用することを検討してください。

一般に、Qt と例外を混在させる場合は注意が必要です。

于 2012-05-22T09:37:32.457 に答える
0

BOOST_THROW_EXCEPTION は、boost::throw_exception を呼び出します。これには、例外オブジェクトが std::exception から派生する必要があります (www.boost.org/doc/libs/release/libs/exception/doc/throw_exception.html を参照)。コンパイル エラーは、その要件を強制します。

もう1つ、参照によって例外をキャッチします。代わりに catch(std::exception e), catch( std::exception & e ) を使用しないでください。

于 2012-06-21T01:40:44.830 に答える