如何调试std::bad_cast异常

How to debug a std::bad_cast exception

本文关键字:bad cast 异常 std 何调试 调试      更新时间:2023-10-16
class GAGenome {
  virtual void method(){};
};
template <class T>
class GAArray {
};
template <class T>
class GA1DArrayGenome : public GAArray<T>, public GAGenome {
};
int main() {
  GA1DArrayGenome<float> genome;
  const GAGenome & reference = genome;
  auto cast = dynamic_cast<const GA1DArrayGenome<int> &>(reference);
}

这个明显错误的程序(因为模板参数不同(与崩溃

terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
Aborted (core dumped)

除了运行时错误消息之外,还有什么方法可以精确诊断出问题吗?可以向我指出int/foat错误的东西?我正在寻找类似的描述性错误消息

const GA1DArrayGenome<float> &无法转换为const GA1DArrayGenome<int> &

更好的是,由于C++类型有时会变得棘手,该工具可以注意到模板参数中的精确差异。

您也可以放弃直接使用dynamic_cast,并将其封装在自己的模板机制中:

#include <sstream>
class my_bad_cast: public std::bad_cast {
public:
    my_bad_cast(char const* s, char const* d): _source(s), _destination(d) {
#ifdef WITH_BETTER_WHAT
        try {
            std::ostringstream oss;
            oss << "Could not cast '" << _source
                << "' into '" << _destination << "'";
            _what = oss.str();
        } catch (...) {
            _what.clear();
        }
#endif
    }
    char const* source() const { return _source; }
    char const* destination() const { return _destination; }
#ifdef WITH_BETTER_WHAT
    virtual char const* what() const noexcept {
        return not _what.empty() ? _what.c_str() : std::bad_cast::what();
    }
#endif
private:
    char const* _source;
    char const* _destination;
#ifdef WITH_BETTER_WHAT
    std::string _what;
#endif
    // you can even add a stack trace
};
template <typename D, typename S>
D my_dynamic_cast(S&& s) {
    try {
        return dynamic_cast<D>(std::forward<S>(s));
    } catch(std::bad_cast const&) {
        throw my_bad_cast(typeid(S).name(), typeid(D).name());
    }
}

您可以在gbd中加载程序(使用调试信息编译,例如gcc和glang中的-g(,告诉gdb使用catch throw捕获异常,然后查看调用堆栈以查看异常的确切抛出位置。

dynamic_cast在运行时失败时抛出std::bad_cast