在C++中没有"空指针异常"这样的东西.你可以捕捉唯一的例外,是明确地抛出的异常throw
表达(加,如帕维尔注意到,一些标准的C++异常本质上通过标准抛出operator new
,dynamic_cast
等).C++中没有其他例外.取消引用空指针,除以零等不会在C++中生成异常,它会产生未定义的行为.如果您希望在这样的情况下抛出异常,那么您自己有责任手动检测这些条件并throw
明确地执行.这就是它在C++中的工作方式.
你似乎在寻找的其他东西都与C++语言有关,而是特定实现的一个特性.例如,在Visual C++中,系统/硬件异常可以"转换"为C++异常,但这种非标准功能需要附加价格,这通常不值得付费.
在C++中没有"空指针异常"这样的东西.你可以捕捉唯一的例外,是明确地抛出的异常throw
表达(加,如帕维尔注意到,一些标准的C++异常本质上通过标准抛出operator new
,dynamic_cast
等).C++中没有其他例外.取消引用空指针,除以零等不会在C++中生成异常,它会产生未定义的行为.如果您希望在这样的情况下抛出异常,那么您自己有责任手动检测这些条件并throw
明确地执行.这就是它在C++中的工作方式.
你似乎在寻找的其他东西都与C++语言有关,而是特定实现的一个特性.例如,在Visual C++中,系统/硬件异常可以"转换"为C++异常,但这种非标准功能需要附加价格,这通常不值得付费.
你不能.取消引用空指针是一个系统问题.
在Linux上,操作系统会在您的应用程序中引发信号.看看csignal,了解如何处理信号.为了"捕获"一个,你将挂钩一个函数,在这种情况下将被调用SIGSEGV
.在优雅地终止程序之前,您可以尝试打印一些信息.
Windows使用结构化异常处理.您可以使用instristics __try/__except
,如上一个链接中所述.我在我编写的某个调试实用程序中使用该函数的方式_set_se_translator
(因为它与钩子紧密匹配).在Visual Studio中,确保已启用SEH.使用该函数,您可以挂钩函数以在系统在应用程序中引发异常时调用; 在你的情况下,它将调用它EXCEPTION_ACCESS_VIOLATION
.然后,您可以抛出异常并将其传播回去,就像首先抛出异常一样.
取消引用null(或指向数组末尾的指针或随机无效指针)会导致未定义的行为.没有可移植的方法来"捕获"它.
有一种非常简单的方法可以使用- > 块在Visual Studio中捕获任何类型的异常(除零,访问冲突等).try
catch (...)
一个小项目调整就足够了.只需/EHa
在项目设置中启用该选项即可.请参阅项目属性 - > C/C++ - >代码生成 - >将启用C++例外修改为"是和SEH例外".而已!
详情请见:http: //msdn.microsoft.com/en-us/library/1deeycx5(v = vs.)
C++不做指针检查(虽然我认为有些实现可以).如果你试图写入空指针,它很可能会崩溃.它不会抛出异常.如果你想要捕获它,你需要在尝试写入之前自己检查指针的值.