Code::Blocks 16.01抛出char const*异常致程序终止问题求助
解决你遇到的C++异常处理终止错误
嘿,作为编程新手碰到这个问题太正常了,我来帮你理清楚问题根源,一步步搞定它!
你看到的terminate called after throwing an instance of 'char const*'错误,核心原因是:你抛出了一个const char*类型的异常,但代码里完全没有对应的catch块来捕获它。C++有个规则:如果抛出的异常没被任何catch逻辑处理,程序就会触发std::terminate()直接终止运行——这和IDE设置没关系,所以恢复默认配置自然没用哦。
先拆解下你的代码问题:
- 你重写了标准库的
sqrt函数,这很容易和系统自带的函数冲突,建议改成自定义名字比如mySqrt; - 你抛出了字符串字面量(
"Negative number is not allowed"),但整个代码里没有用try-catch结构包裹可能抛异常的代码,也没有对应类型的catch块。
修正方案1:捕获const char*类型异常
把代码改成这样,补上完整的异常处理逻辑:
#include <iostream> #include <cmath> #include <stdexcept> using namespace std; // 改名避免和标准库sqrt冲突 double mySqrt(double num) { if(num < 0) throw "Negative number is not allowed"; double x = pow(num, 0.5); return x; } int main() { double num; cout << "Enter a number: "; cin >> num; // 用try包裹可能抛出异常的代码 try { double result = mySqrt(num); cout << "Square root is: " << result << endl; } // 专门捕获const char*类型的异常 catch(const char* error_msg) { cerr << "Error: " << error_msg << endl; } return 0; }
更规范的方案2:使用标准库异常类型
C++标准库提供了一系列异常类(比如std::invalid_argument),比直接抛出字符串更符合语言规范,类型也更安全,推荐你用这个写法:
#include <iostream> #include <cmath> #include <stdexcept> using namespace std; double mySqrt(double num) { if(num < 0) // 抛出标准异常类,传递错误信息 throw invalid_argument("Negative number is not allowed"); double x = pow(num, 0.5); return x; } int main() { double num; cout << "Enter a number: "; cin >> num; try { double result = mySqrt(num); cout << "Square root is: " << result << endl; } // 捕获标准异常的引用,用what()获取错误信息 catch(const invalid_argument& e) { cerr << "Error: " << e.what() << endl; } return 0; }
这样修改后,当你输入负数时,程序就会捕获异常并输出错误信息,而不是直接崩溃终止啦。
内容的提问来源于stack exchange,提问作者loody
相关产品推荐
相关产品推荐

