捕获c ++"访问冲突写入异常"?

use*_*186 4 c++ memory exception

在我的c ++代码中,我有一段代码,它给我一个"访问冲突写入位置..."当用户输入无效时的例外.

我试图在我的try/catch块中捕获此异常,以便在发生异常时显示错误消息..但由于某种原因它没有捕获错误.

try {
    // ... some code that causes Access Violation Writing Location Exception
}
catch (...) {
    std::cout << "invalid user input" << endl;
}
Run Code Online (Sandbox Code Playgroud)

我这样做了,但是当异常发生时,控制台不会显示我的错误消息,但是说有一个

Unhandled exception at 0x0F0B0E9A (msvcr110d.dll) in Example.exe : Access violation writing location
Run Code Online (Sandbox Code Playgroud)

所以看起来我的try/catch块没有捕获异常......

我设置了断点以确保在try块中发生异常..而且我100%就是这种情况..

为什么"catch(...)"没有捕获Access Violation异常?

jal*_*alf 14

不要这样做!

访问冲突不是C++异常.尝试终止应用程序的操作系统是因为它执行了无效的操作.

具体来说,它试图写入一个没有访问权限的内存地址.这基本上意味着您正在写入随机内存,这意味着即使您确实捕获了此错误并向用户显示了一条很好的错误消息,它也可能并不总是有效.有时,程序可能最终写入程序的其他部分,而不是写入您没有写入权限的内存.这不会引发访问冲突,因此不会检测到问题.它只会破坏你的程序.

只有做到这一点正确的做法是验证用户输入.必须检查用户输入是否为程序可以安全处理的形式.如果不是,则必须更正或中止,并向用户显示错误.您必须在自己的代码中执行此操作,然后应用程序执行的操作非常糟糕,以至于操作系统不得不尝试终止它.

是的,有处理访问冲突的一种方式,但正如我前面所说,这不是正确的解决您的问题,所以我认为没有理由来阐述就可以了.

  • +1000000的详细解释和原因,而不是只写一行评论告诉我只是"修复它" (2认同)