C ++中的通用异常处理

时间:2017-01-25 01:06:14

标签: python c++ exception exception-handling

在python中你可以使用:

try:
    #some code
except Exception as e:
    print e

这将自动捕获任何异常。假设你想在' #some code" ...中进行简单的划分...

variable = int(raw_input('Input: '))
result = 50/variable

现在,假设有人输入0,或者输入一个字母,甚至是字符串...据我所知,由于我们使用了通用异常catch,所有这些都将被处理掉,因此代码将跳转到除了块,避免崩溃。

在C ++中,你必须检查输入是一个IF语句中的数字,然后在另一个IF语句中检查它是否为零,如果是这样的话,抛出相应的异常/ s

int var = 0, result = 0;

try{
    cin >> var;

    if (var == 0)
        throw "Zero Division Error";

    result = 50/var;

}catch(...){
    //exception handling code
}

所有这一切(虽然不整齐,但做法不好),只需使用纯IF-ELSE语句就可以完成,而不需要 try-catch 块。但是,在C ++中,如果发生任何意外异常,您就完成了。你必须手动处理每个异常,为每个可能的情况添加 throw 语句,而在python中,这是自动完成的,它甚至可以告诉你出了什么问题,以及什么样的异常您的通用变量' 已被捕获。

所以问题是:
有没有办法在任何版本的C ++中编写 try-catch 块,它会自动处理任何异常并将其分配给通用变量供您打印?

因为如果没有,我不会看到使用 try-catch 结构的目的,只是让你的代码看起来整洁有序(与switch语句相同)

2 个答案:

答案 0 :(得分:2)

  

有没有办法在任何版本的C ++中编写try-catch块,它会自动处理任何异常并将其分配给通用变量供您打印?

如果你遵循的做法是只抛出从std::exception公开派生的类类型的异常并覆盖what()方法,以便它返回一个带有一些适当错误的字符串信息。然后可以使用以下方法处理任何异常:

try {
    // ...
} catch (std::exception& e) {
    std::cerr << e.what() << std::endl;
}

例如,您可以编写如下的异常类:

class divide_error : public std::exception {
    const char* what() const {
        return "division by 0";
    }
};

在C ++中究竟什么样的异常有问题的问题更多是基于意见的,并且在其他地方也有所涉及。见When and how should I use exception handling?

答案 1 :(得分:0)

关于像python这样的高级语言“自动”检测异常的事实,这一切都取决于所有东西都是一个对象(甚至简单的整数和字符),并且每个运算符都相应地重载,例如,如果你试图除以零,解释器(而不是C ++的编译器,它只是执行适当的位操作,使其更快但更基本)将操作作为整个预定义方法,并且相应地执行它。重要的是,在python本身预定义的Inside那些方法中,已经有所有必需的检查引发了相应的异常。

如果您花时间重载所有内容并确保您处理的每个变量实际上都是一个对象,并且其所有方法和运算符都执行所有相应的检查,抛出一个通用异常(确保定义默认泛型异常类,派生自std :: exception类,并覆盖相应的方法来实现所需的结果,就像@Brian所说的那样)如果有必要,你可以实现几乎相同的结果。