如何在数据不匹配时引发异常

时间:2013-10-11 14:51:35

标签: c++

我是c ++的新手,正在学习如何处理异常。如果我尝试添加两个不同类型的变量,我希望程序抛出异常。当我编译时,我得到了不匹配错误以及+将无法使用这两种类型的消息,但我希望它抛出异常。

#include <iostream>
#include <stdexcept>
#include <typeinfo>
using namespace std;

int main() {
    try{
       int var1 = 6;
       string var2 = "7";
       if (typeid(var1).name() == typeid(var2).name()){
          cout << var1 + var2;
       } else {
          throw 99;
       }
    }catch (int e){
       cout << "caught a " << e << endl;
    }
}

2 个答案:

答案 0 :(得分:0)

不要这样做。 但如果你真的想要,你可以:

std::string& operator+(std::string& lhs, int rhs)
{
    throw std::runtime_error("That's really stupid.");
    return lhs;
}

答案 1 :(得分:0)

我不确定这是不是你要找的,但是 你在评论中所描述的任何事情都是如此 需要继承。您的所有模板类都必须派生自 一个共同的基础,进行比较:

private:
    virtual void doBinaryFunction( Base const& other ) const = 0;
public:
    void binaryFunction( Base const& other ) const
    {
        if ( typeid( *this ) != typeid( other ) ) {
            throw std::runtime_error( "Type mismatch" );
        }
        doBinaryFunction( other );
    }

在每个派生类中,您static_cast Base const&Derived const&,然后执行必要的操作 完成。

如果你想处理混合类型,你需要某种形式的 双重派遣。

你还提到实现“添加”,其中的类型 添加是不同的。这里的问题是添加了 返回类型取决于要添加的类型。通常 处理这个问题的方法是决定规范类型(比如说 双)。在这种情况下,最好的解决方案可能是提供 某种虚函数,它返回值为 规范类型,使用规范类型进行添加,以及 把它归还。

从来没有这样,这是非常糟糕的设计。首先 当然,你没有“添加”fordchevy并期望获得 他们的速度之和。这没有意义。你可能会 添加ford.speed()chevy.speed()(虽然我不认为 增加两辆无关汽车的速度也是有意义的,) 但无论如何实现,speed函数 必须返回规范类型以获得速度; if fordchevy有不同的具体类型,你会打电话 通过基类中定义的接口。