c ++中所有内容的基类

时间:2016-07-30 10:32:10

标签: c++ exception-handling

在Java中,Object类是所有类的基类。 C ++中是否还有这样的类?

我对这个问题的动机是:

try
{
    if (something) throw int(a);
    if (something) throw char(b);
    if (something) throw float(c);
}
catch(...)
{
    handle
}

除此之外,还有其他方法可以使用单个catch块处理所有这些异常吗?

3 个答案:

答案 0 :(得分:6)

C ++中没有通用的基类。

异常类通常应来自android.app.Fragment,以便std::exception可以使用。

catch(const std::exception&)捕获任何异常对象类型(包括基本类型)。可以使用catch(...)

catch块内重新抛出
throw;

还可以在try { if (something) throw int(a); if (something) throw char(b); if (something) throw float(c); } catch(...) { if(stillFailed) throw; // throws the same exception again } 块内使用std::exception_ptr获取表示抛出对象(未知类型)的std::current_exception()对象。然后可以将其与其他catch(...)个对象进行相等性比较,或者使用std::exception_ptr从另一个函数中重新进行比较。见http://en.cppreference.com/w/cpp/header/exception。无法直接访问异常对象,因为其类型未知。

答案 1 :(得分:1)

此类案例的最通用类型是std::string(毕竟,即使最复杂的程序也只是字符数组)。

将对象编码为文本格式,并在处理方面解析/解释它。

template<class T>
std::string toString(const T& x);

try
{
    if (something) throw toString(int(a));
    if (something) throw toString(char(b));
    if (something) throw toString(float(c));
}
catch(const std::string& ex)
{
    decode and handle
}

但是,如果您愿意采用这种方法,那么C ++就不适合进行编程 - 更好地转换为面向文本或动态语言。

答案 2 :(得分:0)

不,还有其他方法可以使用单个catch块来处理所有这些异常。

需要不同的catch块来处理不同的数据类型throw。 喜欢 对于int catch(int m)

表示char (char m)