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

vvppvyoh  于 2023-05-20  发布在  其他
关注(0)|答案(4)|浏览(136)

**关闭。**这个问题是not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
4年前关闭。
Improve this question
我在下面的代码中发现没有抛出异常,也没有发生错误。问题是,为什么这种情况没有发生。然而,根据评论,这是一个糟糕的问题,无论你如何看待它。一些研究本可以指出以下几点:

#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;
}
hc2pp10m

hc2pp10m1#

try-块中的mightGoWrong;-语句不引用变量,而是引用函数mightGoWrong();请注意,您不调用函数,而只是使用它的名称,而不将其分配给其他对象;正如符号mightGoWrong所知,它只是一个“No操作”,可能会产生一些警告,但不会在编译时产生错误,并且-因为它不会调用函数-它不会在运行时抛出任何东西。
试试mightGoWrong(),看看会发生什么。

qhhrdooz

qhhrdooz2#

命名不存在的变量不会导致异常;它会导致编译程序失败。
但你不会这么做的。你在命名一个函数。你没有调用它,也没有对它做任何事情,但是命名它是法律的的,是一个“无操作”,即。一个毫无用处的声明。
这有点像这样做:

int i = 42;
i;

完全没有意义(并且您的编译器可能会发出警告),但不是非法的!
既然毫无意义为什么不违法呢?好吧,没什么大原因。班宁它是没有意义的。

njthzxwz

njthzxwz3#

你不调用mightGoWrong,所以它不执行抛出
mightGoWrong;不是无效访问,它只是返回函数的地址
我们不像在Java中虚拟机自己抛出异常,在C++中异常必须显式抛出

xzlaal3s

xzlaal3s4#

我注意到未声明的变量不会导致异常
从语言的Angular 来看,不存在“未声明变量”这样的东西。当标识符被声明为变量时,它就是一个变量。如果某个东西没有被声明,那么它就不是变量。
无论如何,如果你使用了一个未声明的 identifier,那么这个程序就是病态的。标准并没有说格式错误的程序会抛出异常,因此您的期望是错误的。事实上,标准并不要求格式错误的程序被成功编译,而且在未声明标识符的情况下,我不希望任何编译器这样做。
mightGoWrong既不是未声明的,也不是变量。它被声明为一个函数。mightGoWrong;的行为是不抛出异常。事实上,这种说法没有任何效果。虽然这样的语句是格式良好的,但它们很少是程序员想要的,因此可能会导致编译器向程序员发出警告。在本例中,您可能会看到:

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

相关问题