簡體   English   中英

是否可以從堆棧溢出異常中恢復並在處理異常后繼續執行下一條指令?

[英]Is it possible to recover from stack overflow exception and continue executing the next instruction after handling the exception?

例如,這段代碼會因為無限遞歸而拋出Stack Overflow,從而導致程序崩潰。 有沒有辦法處理這個異常並避免崩潰並繼續執行下一條指令?

#include <iostream>
#include <exception>

template <typename T>
T sum(T firstValue, T secondValue)
{
        try{
                return firstValue + secondValue;
        }

        catch(const std::exception &e)
        {
                std::cerr << "Caught exception: " << e.what() << '\n';
        }
}

void causeStackOverflow() {
    causeStackOverflow();
}

int main() {

        std::cout << "Sum of 3 & 4 is: " << sum(3, 4) << '\n';

    try {
        causeStackOverflow();
    }

    catch (const std::exception& e) {
        std::cerr << "Caught exception: " << e.what() << '\n'; // If anything can be done here so program can recover and next line can execute?
    }

        std::cout << "Sum of 1 & 2 is: " << sum(1, 2) << '\n';

    return 0;
}

必須有一些方法可以在這里使用來做到這一點。 另一個問題是,即使可能,是否也應該這樣做?

有什么方法可以以一定的概率預測 Stack Overflow 會發生嗎? 那么我們可以采取一些措施來避免這種情況嗎?

您可以參考 MSDN 文檔來調試堆棧溢出

使用 .analyze 命令檢查我們的循環是否確實有問題。

dt _TEB 可用於顯示信息。

很難捕捉到,因為操作系統會終止進程。 供您參考: C++: Getting exception from stack overflow? .

在 Windows 上,使用 Microsoft Visual C++,您可以使用結構化異常處理 (SEH) 處理堆棧溢出,如下所示:

#include <windows.h>
#include <iostream>

void causeStackOverflow() {
    causeStackOverflow();
}

int main() {
    __try {
        causeStackOverflow();
    }
    __except (GetExceptionCode() == EXCEPTION_STACK_OVERFLOW) {
        std::cout << "Handled!\n";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM