当前位置:  开发笔记 > 编程语言 > 正文

如何捕获空指针异常?

如何解决《如何捕获空指针异常?》经验,为你挑选了5个好方法。

在C++中没有"空指针异常"这样的东西.你可以捕捉唯一的例外,是明确地抛出的异常throw表达(加,如帕维尔注意到,一些标准的C++异常本质上通过标准抛出operator new,dynamic_cast等).C++中没有其他例外.取消引用空指针,除以零等不会在C++中生成异常,它会产生未定义的行为.如果您希望在这样的情况下抛出异常,那么您自己有责任手动检测这些条件并throw明确地执行.这就是它在C++中的工作方式.

你似乎在寻找的其他东西都与C++语言有关,而是特定实现的一个特性.例如,在Visual C++中,系统/硬件异常可以"转换"为C++异常,但这种非标准功能需要附加价格,这通常不值得付费.



1> AnT..:

在C++中没有"空指针异常"这样的东西.你可以捕捉唯一的例外,是明确地抛出的异常throw表达(加,如帕维尔注意到,一些标准的C++异常本质上通过标准抛出operator new,dynamic_cast等).C++中没有其他例外.取消引用空指针,除以零等不会在C++中生成异常,它会产生未定义的行为.如果您希望在这样的情况下抛出异常,那么您自己有责任手动检测这些条件并throw明确地执行.这就是它在C++中的工作方式.

你似乎在寻找的其他东西都与C++语言有关,而是特定实现的一个特性.例如,在Visual C++中,系统/硬件异常可以"转换"为C++异常,但这种非标准功能需要附加价格,这通常不值得付费.



2> GManNickG..:

你不能.取消引用空指针是一个系统问题.

在Linux上,操作系统会在您的应用程序中引发信号.看看csignal,了解如何处理信号.为了"捕获"一个,你将挂钩一个函数,在这种情况下将被调用SIGSEGV.在优雅地终止程序之前,您可以尝试打印一些信息.

Windows使用结构化异常处理.您可以使用instristics __try/__except,如上一个链接中所述.我在我编写的某个调试实用程序中使用该函数的方式_set_se_translator(因为它与钩子紧密匹配).在Visual Studio中,确保已启用SEH.使用该函数,您可以挂钩函数以在系统在应用程序中引发异常时调用; 在你的情况下,它将调用它EXCEPTION_ACCESS_VIOLATION.然后,您可以抛出异常并将其传播回去,就像首先抛出异常一样.


嘿,我说:P

3> Pavel Minaev..:

取消引用null(或指向数组末尾的指针或随机无效指针)会导致未定义的行为.没有可移植的方法来"捕获"它.



4> Volodymyr Fr..:

有一种非常简单的方法可以使用- > 块在Visual Studio中捕获任何类型的异常(除零,访问冲突等).trycatch (...)

一个小项目调整就足够了.只需/EHa在项目设置中启用该选项即可.请参阅项目属性 - > C/C++ - >代码生成 - >将启用C++例外修改为"是和SEH例外".而已!

详情请见:http: //msdn.microsoft.com/en-us/library/1deeycx5(v = vs.)



5> Nate C-K..:

C++不做指针检查(虽然我认为有些实现可以).如果你试图写入空指针,它很可能会崩溃.它不会抛出异常.如果你想要捕获它,你需要在尝试写入之前自己检查指针的值.


这实际上取决于实施和操作系统.例如,在Win32上,取消引用空指针将导致访问冲突(实际上是任何其他具有内存保护的平台),但Win32 AV是一个结构化异常,它可以被C++编译器捕获,该编译器实现了自己的异常模型Win32 SEH的顶部 - 例如,VC++带有`/ EHa`编译标志.当然,它仍然是纯粹的邪恶(并且不可移植).
说到内存保护,我开始在DOS上编写C语言,当写入空指针通常意味着你要重启你的机器.至少DOS启动得相当快.
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有