捕获C++中的“访问冲突写入异常”?

6

在我的c++代码中,当用户输入无效时,我有一段代码会给我一个“访问冲突写入位置…”异常。

我尝试在try/catch块中捕获此异常以在出现异常时显示错误消息。但是由于某种原因,它没有捕获错误。

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

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


Unhandled exception at 0x0F0B0E9A (msvcr110d.dll) in Example.exe : Access violation writing location

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

我设置了断点以确保异常发生在try块内..我100%确定是这样的情况..

为什么"catch (...)"没有捕获访问冲突异常?


1
那不是你可以捕获和处理的普通C++异常。 - chris
7
为何不先找出问题产生的原因并解决它呢? - chris
这条评论上面值得点一千个+1。 - Marco A.
@chris 当用户输入无效输入时会发生这种情况...我不能假设用户每次都会输入有效的内容,所以我只是试图在它发生时捕获它,而不是让我的程序崩溃。 - user3794186
1
@user3794186,请提供一个 MCVE 以及一些您无法验证的示例输入,我们会告诉您如何验证它们。 - chris
显示剩余3条评论
1个回答

17

不要这样做!

访问冲突并不是C++异常,而是操作系统试图终止应用程序,因为它执行了无效操作。

具体来说,它尝试写入一个没有访问特权的内存地址。这基本上意味着你在随机内存中写入数据,这意味着即使你捕获此错误并向用户显示一个漂亮的错误消息,有时也可能不起作用。有时候,程序可能会将数据写入其他部分,这些部分您没有写入权限,但却不会引发访问冲突,因此问题不会被检测到。它只会破坏你的程序。

唯一正确的方法是验证用户输入。 必须检查用户输入是否以您的程序可以安全处理的方式进行。如果不安全,则必须更正或者中断并向用户显示一个错误。在应用程序执行严重错误之前,您必须在自己的代码中进行验证。

是的,处理访问冲突的方法,但如上所述,这不是解决您问题的正确方法,因此我认为没有理由详细说明。


4
请详细解释并说明原因,而不是只写一行评论告诉我简单地“修复它”,奖励100万。 - user3794186
@jalf 你好,我想知道你是否能详细解释一下我的问题 https://stackoverflow.com/questions/50165795/c-make-a-program-write-over-itself,以及你在这里所说的内容,尤其是关于覆盖程序不会引发访问冲突的部分!谢谢! :) - The Floating Brain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接