gpt4 book ai didi

c++ - 在 C++ 中从自定义 sqrt 函数捕获异常失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:24 26 4
gpt4 key购买 nike

我在尝试演示异常处理时遇到了一个我无法解决的怪事。问题出现在以下代码中:

#include <iostream>
#include <cmath>
#include <stdexcept>

using namespace std;

double sqrt(double x) {
if ( x < 0 ){
throw invalid_argument("sqrt received negative argument");
}
return sqrt(x);
}


int main(int argc, char *argv[]) {

try {
double s = sqrt(-1);
}
catch (const exception& e) {
cout << "Caught " << e.what() << endl;
}
return 0;
}

代码失败:

 terminate called after throwing an instance of 'std::invalid_argument'
what(): sqrt received negative argument
./dostuff.sh: line 8: 3472 Aborted (core dumped) ./may_22.exe

但是,如果我将我写入的 sqrt 函数的名称更改为“mySqrt”,或者删除 header ,则会正确捕获异常。知道是什么原因造成的吗?

我正在通过编译

 g++ -g -Wall -std=c++0x -Weffc++   may_22.cpp -o may_22.exe

使用 g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1

编辑:澄清一下,这似乎不是 namespace 问题。代码显然正在调用我的 sqrt 函数,如异常消息所示。

编辑 2:这段代码仍然无法为我处理异常。

#include <iostream>
#include <cmath>
#include <stdexcept>

double sqrt(double x) {
if ( x < 0 ){
throw std::invalid_argument("sqrt received negative argument");
}
return std::sqrt(x);
}

int main(int argc, char *argv[]) {

try {
double s = sqrt(-1);
}
catch (std::exception& e) {
std::cout << "Caught " << e.what() << std::endl;
}

return 0;
}

最佳答案

您不能调用函数 sqrt,因为它是保留的。您的函数正在被调用,但您的实现还包含一个头文件,该文件表明 sqrt 无法抛出。将函数名称更改为其他名称,问题就会消失。

如果将函数更改为 double sqrt(double const& x) {,您也可以看到问题。您可能会收到有关重载冲突的错误。

关于c++ - 在 C++ 中从自定义 sqrt 函数捕获异常失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818718/

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