在我的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%就是这种情况..
为什么&#34;赶上(...)&#34;没有捕获访问冲突异常?
答案 0 :(得分:14)
不要这样做!
访问冲突不是C ++异常。尝试终止应用程序的操作系统因为它执行了无效的操作。
具体来说,它试图写入一个没有访问权限的内存地址。这基本上意味着你正在写入随机内存,这意味着即使你 捕获了这个错误并向用户显示了一个很好的错误消息,它也可能并不总是有效。有时,程序可能最终写入程序的其他部分,而不是写入您没有写入权限的内存。这不会引发访问冲突,因此不会检测到问题。它只会破坏你的程序。
唯一正确的方法是验证您的用户输入。 您必须检查用户输入是否为您的程序可以安全处理的格式。如果不是,则必须更正或中止,并向用户显示错误。您必须在自己的代码中执行此操作,之前您的应用程序执行的操作非常糟糕,以至于操作系统不得不尝试终止它。
是的,是处理访问冲突的方法,但正如我上面所说,这不是解决问题的正确方法,所以我认为没有理由详细说明。