在 C++ 中,是否有标准方法(或任何其他方法)来捕获由内存访问冲突触发的异常?
例如,如果出现问题并且程序试图访问它不应该访问的东西,您将如何收到一条错误消息显示“内存访问冲突!” 而不是仅仅终止进程而不向用户显示有关崩溃的任何信息?
我正在使用 MinGW 为 Windows 编写游戏,如果有帮助的话。
在 C++ 中,是否有标准方法(或任何其他方法)来捕获由内存访问冲突触发的异常?
例如,如果出现问题并且程序试图访问它不应该访问的东西,您将如何收到一条错误消息显示“内存访问冲突!” 而不是仅仅终止进程而不向用户显示有关崩溃的任何信息?
我正在使用 MinGW 为 Windows 编写游戏,如果有帮助的话。
Access violation
是硬件异常,不能被标准捕获try...catch
。
由于硬件异常的处理是系统特定的,因此在代码中捕获它的任何解决方案也将是系统特定的。
在 Unix/Linux 上,您可以使用 aSignalHandler
来捕获SIGSEGV
信号。
在 Windows 上,您可以使用语句捕获这些结构化异常。__try/__except
这对您没有太大帮助,但是如果您使用以下命令编译,则可以在 MSVC中使用try
...捕获访问冲突和其他 SEH 异常:catch(...)
/EHa
#include <iostream>
int main() {
try {
*(int*)0 = 0;
}
catch (...) {
std::cerr << "Exception!\n";
}
}
输出:
Exception!
唯一的缺点是你无法知道出了什么问题。要了解有关异常的更多信息,您可以使用_set_se_translator设置自定义 SEH 翻译函数,如本文所示。