【发布时间】:2017-10-23 21:37:21
【问题描述】:
我对错误处理有一个疑问...
如果一个函数抛出一个异常并且该异常没有在主程序中被捕获,则会严重崩溃。
我的问题是为什么这个程序不会崩溃?如果从Test 抛出异常,函数enterNumber 也会抛出异常,即使它没有被捕获?
不应该将每个可能抛出异常的函数都放在 try-catch 块中,以防万一它抛出异常吗?
1°
#include <iostream>
#include <stdexcept>
void Test(int number) {
if(number < 0)
throw std::domain_error("Number is negative");
}
int enterNumber() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
Test(number);
return number;
}
int main() {
try {
int number = enterNumber();
std::cout << "Entered number: " << number;
}
catch(std::domain_error e) {
std::cout << e.what();
}
return 0;
}
我觉得应该这样写:
2°
void Test(int number) {
if(number < 0)
throw std::domain_error("Number is negative");
}
int enterNumber() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
try {
Test(number);
}
catch(...) {
throw;
}
return number;
}
int main() {
try {
int number = enterNumber();
std::cout << "Entered number: " << number;
}
catch(std::domain_error e) {
std::cout << e.what();
}
return 0;
}
如果有人能解释函数enterNumber 在Test 抛出异常时如何抛出异常? (案例1°)
谢谢你:)
【问题讨论】:
-
按照 C++ 的设计工作。一个未捕获的函数在堆栈中冒泡。
-
函数允许出现异常。一旦出现泡沫,问题就出现了。如果你没有从 main 中冒出,那你就没事了。
-
您的
try { Test(number); } catch(...) { throw;构造完全没有意义。您捕获所有异常,然后立即重新抛出它们 - 就像您刚刚删除try/catch一样。 -
异常会向上传播到调用堆栈。这是它的优点之一,记住传播错误的负担不在于开发人员。
标签: c++ exception error-handling try-catch throw