gpt4 book ai didi

c++ - 捕获异常而不必抛出

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:07:16 25 4
gpt4 key购买 nike

我是 C++ 的新手,我来自 Delphi 场景,在该场景中,我无需显式声明 throw 即可捕获异常。看这里:

#include<iostream>
#include<exception>

int main() {

try {

int c;
std::cin >> c;

} catch(...) {

std::cerr << "Warning!" << std::endl;
char xz; std::cin >> xz;
return 1;

}

char z; std::cin >> z;
return 0;

}

//I return 1 because UNIX OS cares about this, a return != 0 means that Huston we have a problem

我已经看到一些异常(例如被零除)不会被自动捕获,所以我必须自己创建一个 throw,它肯定会在我的 try block 中被捕获.

如果你看上面的代码,当我第一次输入 6.7test 时,我应该能够在输出中看到 warning! ,但什么也没有。我在 Windows 10 机器上运行。

我知道 catch(...) 是通用的,可以肯定地为我提供保护,但为什么它没有捕捉到错误的输入?


注意。我在上面提到了 Delphi,因为如果您查看下面的代码,我就能发现错误。

try

a := StrToInt('6.78'); //conversion error [string->double], a is int
ShowMessage('a is ' + a.ToString);

except
on E: Exception do

ShowMessage('Warning! > ' + e.Message);
//^ raises "Warning! > '6.78' is not a valid integer value."

end;

为什么我不能用 C++ 产生相同的效果?我知道它们是两种不同的语言,但起初我会说 delphi 更好地“处理”异常。例如,它会自动捕获被零除(见下文),而 c++ 不会。

//this raises the "Division by zero" error.
a := 8 div StrToInt('0');

结论。所以问题是:我是否正确声明了 C++ try-catch?我是否总是必须使用 throw确定错误会被捕获,或者我有时可以忽略它?

最佳答案

documentation 中所述您需要在 std::cin 上设置异常掩码以使其抛出 std::ios_base::failure :

#include <iostream>

int main() {
std::cin.exceptions( std::ios::failbit );
try {
int i = 0;
std::cin >> i;
std::cout << "i=" << i << std::endl;
}
catch(...) {
std::cerr << "error!" << std::endl;
}
return 0;
}

live example

Do I always have to use the throw to be sure that the error will be caught or I can omit it some times?

是的,要抛出异常你需要调用throw。尽管库可能会针对错误情况(包括标准错误情况)为您调用 throw,但它可能会抛出什么异常以及何时应该在文档中说明。

关于c++ - 捕获异常而不必抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41047991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com