我正在修饰我的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;
}
答案 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]