[英]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.