C++ 如果从在其他函数中调用的函数引发异常,会发生什么情况?

C++ 如果从在其他函数中调用的函数引发异常,会发生什么情况?,c++,exception,error-handling,try-catch,throw,C++,Exception,Error Handling,Try Catch,Throw,我对错误处理有一个疑问 若一个函数抛出一个异常,而该异常在主程序中并没有被捕获,那个么该异常将严重崩溃 我的问题是为什么这个程序没有崩溃?如果从测试函数中抛出异常,即使未捕获,enterNumber也会抛出异常吗 每个可能抛出异常的函数不都应该放在try-catch块中,以防抛出异常吗 1° 我认为应该这样写: 2° void Test(int number) { if(number < 0) throw std::domain_error("Number is n

我对错误处理有一个疑问

若一个函数抛出一个异常,而该异常在主程序中并没有被捕获,那个么该异常将严重崩溃

我的问题是为什么这个程序没有崩溃?如果从测试函数中抛出异常,即使未捕获,enterNumber也会抛出异常吗

每个可能抛出异常的函数不都应该放在try-catch块中,以防抛出异常吗

我认为应该这样写:

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在测试抛出异常时是如何抛出异常的?情况1°


谢谢:

您不需要从调用导致异常的函数的函数中捕获异常。实际上,最佳实践是尽可能地捕捉异常,但不要远离引发异常的站点,因为只有在程序的更高级别上,您才有足够的信息来生成有意义的错误消息,和/或以其他方式处理异常。但是,异常应该在程序的某个级别被捕获,或者程序将以不受控制的方式终止。C++的设计是

。未捕获的函数在堆栈中冒泡。允许异常从函数中冒泡出来。一旦泡沫脱离主流,这就是问题所在。如果你没有从主管道冒出气泡,那么你就没事了。你可以试试{Testnumber;}catch。。。{throw;构造是完全没有意义的。您捕获所有异常,然后立即重新抛出它们-就像您刚刚删除try/catch时发生的情况一样。异常会向调用堆栈上传播。这是它的优点之一,记住传播错误的负担不在开发人员身上。对于某些异常,允许它们传播错误cape main和关闭程序也可以很好。有时,崩溃并编写一个内核以供以后调试比试图从一个破碎的世界中恢复要好,并可能造成更多的伤害。最佳做法是尽可能从引发异常的站点捕获异常。这对我来说似乎不正确,但我认为plies认为,在主线程或线程的主函数中捕获异常是捕获异常的最佳位置。也许最佳实践是只在您可以对异常或其效果做一些事情的情况下捕获异常。@François我说了尽可能多-在主线程中捕获和处理所有异常通常是不可能的。我已经修正了e稍微回答一下。@NeilButterworth我仍然不同意。这表明你离投球越远越好。我想在我听来,你是在说,如果你知道另一个catch子句准备好处理更高层次的异常,你应该避免捕捉到有意义的异常。@François不,我不是指n因为我认为如果你的程序中有一个,你不需要知道捕获层次结构。我提供了一个尽可能远离抛出的启发式捕获,因为经验告诉我,绝大多数程序员捕获尽可能接近,吃掉异常,并经常因此将他们的程序放入UB land。
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;
}