c++ - 捕捉 c++ "Access Violation Writing Exception"?

标签 c++ exception memory

在我的 C++ 代码中,我有一个代码块,当用户输入无效时会出现“访问冲突写入位置...”异常。

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

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 block 没有捕捉到异常...

我设置了断点以确保异常发生在 try block 中..我 100% 是这样..

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

最佳答案

不要这样做!

访问冲突不是 C++ 异常。这是操作系统试图终止应用程序,因为它做了一些无效的事情。

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

执行此操作的唯一正确方法是验证您的用户输入。 必须检查用户输入的形式是否是您的程序可以安全处理的形式。如果不是,则必须更正它或中止,并向用户显示错误。您必须在自己的代码中执行此操作,您的应用程序执行某些糟糕到操作系统被迫尝试终止它之前。

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

关于c++ - 捕捉 c++ "Access Violation Writing Exception"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24739986/

相关文章:

c++ - SDL2窗口是透明的

c++ - 创建 x 个数组

java - selenium cucumber JUnit 框架中的空指针异常

java - 什么可能导致 java.lang.reflect.InvocationTargetException?

javascript 匿名事件与命名事件

html - Qt4中XSLT转HTML,key函数不可用

c++ - 将对象从一个 unordered_map move 到另一个容器

c# - Visual Studio 中是否有击键来切换中断所有 CLR 异常,第一次机会?

c - printf 输出垃圾而不是特定字符

c++ - 重复常量 c_strings 是否重复?