为什么在try块中访问未声明的变量不会导致C ++中的异常

时间:2019-01-15 11:47:59

标签: c++ exception-handling

我正在修饰我的C ++技能。在此期间,我遇到了异常处理,我注意到未声明的变量不会导致异常,这对我来说很奇怪。

我期望该程序以未捕获的异常(如果正确设置了编译器)终止,因为在try块中,我试图访问未声明的变量。有人可以帮助我理解为什么我没有遇到(未捕获的)异常吗?

#include <iostream>
using namespace std;

void mightGoWrong() {
    bool error = true;

    if (error) {
        throw 8;
    }
}

int main () {

        try {
            mightGoWrong;
        }
        catch(int error) {
            cout << "The error code is: " << error << endl;
        }


        cout << "Still running" << endl;

        return 0;
}

4 个答案:

答案 0 :(得分:3)

您的mightGoWrong;块中的try语句不是引用变量,而是引用函数mightGoWrong();注意,您不调用函数,而只是使用其名称而不将其分配给某些东西。由于符号mightGoWrong众所周知,它只是一个“无操作”,可能会在编译时产生一些警告,但不会产生错误,并且-因为它不会调用该函数-所以它在运行时不会抛出任何内容。

改为尝试mightGoWrong(),看看会发生什么。

答案 1 :(得分:1)

命名不存在的变量不会导致异常;它会导致无法编译程序。

但是您没有这样做。您正在命名一个函数。您没有调用它,也没有对其进行任何操作,但是将其命名为合法且是“禁止操作”,即不执行任何操作的声明。

有点像这样做:

int i = 42;
i;

完全没有意义(您的编译器可能会发出警告),但不是非法的!

为什么毫无意义的时候不合法?好吧,没有大的理由。没什么可禁止的。

答案 2 :(得分:0)

您不会呼叫mightGoWrong,因此不会引发掷骰子

mightGoWrong;不是无效的访问,它只是返回函数的地址

在Java中,虚拟机本身会引发异常,而在C ++中,异常必须被明确地引发

答案 3 :(得分:0)

  

注意到未声明的变量不会导致异常

从语言角度看,没有“未声明的变量”之类的东西。当标识符被声明为变量时,它就是一个变量。如果未声明某些内容,则它不是变量。

无论如何,如果您使用未声明的 identifier ,则程序格式错误。该标准并不表示格式错误的程序会引发异常,因此您的期望被误导了。实际上,标准不要求格式错误的程序可以成功编译,并且在标识符未声明的情况下,我不希望任何编译器这样做。

mightGoWrong既未声明,也不是变量。它被声明为一个函数。 mightGoWrong;的行为是不会引发异常。实际上,该声明没有任何作用。尽管这样的语句格式正确,但它们很少是程序员的惯用话,因此很可能导致编译器向程序员发出警告。在这种情况下,您可能会看到:

warning: statement is a reference, not call, to function 'mightGoWrong' [-Waddress]
         mightGoWrong;
                     ^
warning: statement has no effect [-Wunused-value]