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

Catching exception from custom sqrt function fails in C++

本文关键字:c++ 失败 捕获异常 自定义 sqrt 函数      更新时间:2023-10-16

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

#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",或者删除头,异常被正确捕获。知道是什么原因造成的吗?

我通过

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

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

EDIT:澄清一下,这似乎不是名称空间问题。代码显然在调用我的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) {,也可以看到问题。您可能会得到关于冲突的重载的错误。