gpt4 book ai didi

c++ - 为什么我不能捕捉到这个异常?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:34 26 4
gpt4 key购买 nike

我想创建一些派生自 std::runtime_error 的异常类型,并且我希望它们具有 stringstream 类型的功能。因此,我创建了一个异常类,它由 std::stringstream 派生自 std::runtime_error:

template<typename T>
class error_stream : public std::runtime_error
{
public:
error_stream() :
std::runtime_error(""), ss(std::make_shared<std::basic_stringstream<T>> ())
{
}

~error_stream() throw()
{
}

template <typename T>
error_stream & operator << (const T & t)
{
*ss << t;
return *this;
}

virtual const char * what() const throw()
{
get_str(s_, ss->str());
return s_.c_str();
}

protected:

template <typename T>
void get_str(std::basic_string<char> & s_, const std::basic_string<T> & str) const
{
s_ = str;
}

template<>
void get_str(std::basic_string<char> & s_, const std::basic_string<wchar_t> & str) const
{
std::basic_string<char> ret(str.begin(), str.end());
s_ = ret;
}

protected:
std::shared_ptr<std::basic_stringstream<T>> ss;
mutable std::basic_string<char> s_;
};

我还创建了一个更具体的异常类型,它又派生自此 error_stream 异常:

template<typename T>
class w32file_exception : public w32utils::error_stream<T>
{
public:
w32file_exception() : error_stream<T>() {}
};

但是,我在这里遇到了一些我不明白的事情,因为当我抛出一个 w32file_exception 时,我实际上只能捕获它,因为它是父级 error_stream。谁能看出我做错了什么?

    try
{
throw w32file_exception<char>() << "test";
}
catch ( w32file_exception<char> & e )
{
ASSERT_PASSED;
}
catch ( error_stream<char> & e )
{
std::cout << e.what() << std::endl; // Why do I end up here?
}

最佳答案

你的 throw 到底是什么?看起来像?你在用你的operator<<吗?在调用 throw 之前,像这样:

throw w32file_exception<T>() << "fooobar";

那么答案就是,你的 operator<<返回 error_stream没有 w32file_exception所以抛出的异常类型是error_stream .

你可以这样解决这个问题:

template<typename T, typename DERIVED>
class error_stream : public std::runtime_error
{
public:
// ...
template <typename U>
DERIVED & operator << (const T & t)
{
*ss << t;
return static_cast<DERIVED&>(*this);
}
// ...
};

但是你失去了捕捉每一个error_stream的能力异常,因为它是每个 DERIVED 的新类型类型。

关于c++ - 为什么我不能捕捉到这个异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com