Visual c++ 如何在Visual Studio C+中处理访问冲突+;?

Visual c++ 如何在Visual Studio C+中处理访问冲突+;?,visual-c++,exception-handling,access-violation,structured-exception,Visual C++,Exception Handling,Access Violation,Structured Exception,通常访问冲突会终止程序,我无法使用try和catch捕获Win32异常。有没有一种方法可以让我的程序保持运行,即使是在访问冲突的情况下?最好是我想处理异常并向用户显示发生了访问冲突 编辑:我希望我的程序非常健壮,即使是针对编程错误。我真正想避免的是程序终止,即使是以某些损坏状态为代价 在Windows中,这称为结构化异常处理(SEH)。有关详细信息,请参见此处: 实际上,当发生异常时,您可以注册以获取回调。由于明显的原因,您不能对每个异常都这样做 使用SEH,您可以检测到许多异常,包括访问冲突

通常访问冲突会终止程序,我无法使用
try
catch
捕获Win32异常。有没有一种方法可以让我的程序保持运行,即使是在访问冲突的情况下?最好是我想处理异常并向用户显示发生了访问冲突


编辑:我希望我的程序非常健壮,即使是针对编程错误。我真正想避免的是程序终止,即使是以某些损坏状态为代价

在Windows中,这称为结构化异常处理(SEH)。有关详细信息,请参见此处:

实际上,当发生异常时,您可以注册以获取回调。由于明显的原因,您不能对每个异常都这样做


使用SEH,您可以检测到许多异常,包括访问冲突,但不是全部(例如,双堆栈故障)。即使存在可检测的异常,也无法确保异常后100%的稳定性。但是,通知用户、记录错误、将消息发送回服务器并优雅地退出可能就足够了。

我首先要说的是,您的问题包含矛盾:

编辑:我希望我的程序非常健壮。。。我真正想避免的是程序终止,即使是以某些损坏状态为代价

如果一个程序在被破坏的状态下继续运行,那么它就不是健壮的,而是一种负担


第二,某种观点。关于:

编辑:我希望我的程序能够非常健壮,即使是针对编程错误

当你所说的编程错误是指所有的bug时,这是不可能的

<>如果编程错误是指:“程序员滥用一些API,我想要错误消息而不是崩溃,然后编写内置的双重检查的所有代码:例如,在使用之前总是检查所有空指针,即使如果程序员没有出错,也不能将它们无效,等等(哦,您也可以考虑不使用C++;

但是,不管在什么C++应用程序中都会接受一些程序崩溃,除非它是微不足道的,或者是为了军事或医学使用而测试它(甚至是……)。
其他人已经提到了——这是一个“简单”的
\uuuu try/\uu catch
问题


也许你不必试图捕捉程序内部的bug,你可以试着与之成为朋友——我从来没有这样做过,但据我所知,你可以通过
进程外异常…

完全自定义它,可能重复什么?内存访问冲突?你应该编写程序以避免内存访问冲突ons。可能更多一点上下文对任何试图帮助你的人都有用。为什么要向用户显示它,他们将如何处理它?如果a/v在你的代码中,修复它,它是在第三部分代码中,你不能触摸它,找到一些方法来检测它,并显示一些合适的消息,比如抱歉我不能做你想做的事。放入日志f我可以将其删除并吞下,但不要将其显示给用户。是的,我不会对用户尖叫,“访问违规”“。这显然是需要记录的。事实上,这有一个优势,人们似乎错过了。如果你想优雅地退出呢?如果您想向服务器发送错误报告,该怎么办?如果你想弹出一条消息说。。出现问题,是否要保存状态并将数据发送回我们,以便我们在将来的版本中修复它?请注意,在大型组织中,有好的程序员,也有坏的程序员。没有一个相当大的程序是完全没有bug的。面对访问冲突,当然有可能保持程序运行。正如您自己所提到的,保存状态(甚至对流程进行一次小型转储)以进行后期调试是可能的,或者发送错误报告,或者询问用户“发生此情况时您在做什么”都是可能的……这并不一定意味着保持它运行。通常是在退出前的最后一分钟进行清理。。。还有一些你根本无法理解的例外情况,对此你可以做很多事情。您可以重新启动应用程序,以便为自己提供一个新的内存布局和初始化序列,然后重新加载以前的上下文(或任务启动上下文)并从那里继续…我不知道在不知道导致问题的bug时,如何重建程序的状态。如果你知道这个错误,那为什么要把它写在运输代码中呢?重新启动实际上并不能保持程序运行。除此之外,像双堆栈故障这样的事情根本无法处理,但我想这比访问冲突更严重。可能会从“无法检测并保持程序运行”改为“在捕获这样一个错误后,无法确保您的进程100%稳定,或者无法退出由于任何导致访问冲突的错误而导致的所有可能错误”我喜欢Windows错误报告的想法。感谢您的提示。