Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:我应该捕获所有异常还是让程序崩溃? 我有一个Windows服务(Visual C++),它有一个非常详细的日志记录功能,经常帮助我找到客户有时会遇到的错误的原因。基本上,我检查每个返回值并记录发生了什么以及错误来自何处_C++_Windows_Exception_Crash_Minidump - Fatal编程技术网

C++;:我应该捕获所有异常还是让程序崩溃? 我有一个Windows服务(Visual C++),它有一个非常详细的日志记录功能,经常帮助我找到客户有时会遇到的错误的原因。基本上,我检查每个返回值并记录发生了什么以及错误来自何处

C++;:我应该捕获所有异常还是让程序崩溃? 我有一个Windows服务(Visual C++),它有一个非常详细的日志记录功能,经常帮助我找到客户有时会遇到的错误的原因。基本上,我检查每个返回值并记录发生了什么以及错误来自何处,c++,windows,exception,crash,minidump,C++,Windows,Exception,Crash,Minidump,理想情况下,我希望对异常具有相同级别的详细可见性(如数组超出范围、被零除等)。换句话说:我想知道异常的确切来源。出于可读性和实用性的原因,我不想将每几行代码包装成单独的try/catch块 我今天使用的是一个通用的捕获所有内容并在关闭程序之前记录错误的方法。从用户的角度来看,这是好的-完全关闭而不是应用程序崩溃-但对我来说是坏的,因为我只从异常(例如“数组超出范围”)中得到一条通用消息,但不知道这是从哪里来的 删除catch all,让程序崩溃不是更好吗?我可以指导客户让Windows创建一个应

理想情况下,我希望对异常具有相同级别的详细可见性(如数组超出范围、被零除等)。换句话说:我想知道异常的确切来源。出于可读性和实用性的原因,我不想将每几行代码包装成单独的try/catch块

我今天使用的是一个通用的捕获所有内容并在关闭程序之前记录错误的方法。从用户的角度来看,这是好的-完全关闭而不是应用程序崩溃-但对我来说是坏的,因为我只从异常(例如“数组超出范围”)中得到一条通用消息,但不知道这是从哪里来的


删除catch all,让程序崩溃不是更好吗?我可以指导客户让Windows创建一个应用程序崩溃转储(如上所述)。使用转储文件,WinDbg会准确地将我指向代码中引发异常的位置。

您可以通过调用

每当抛出异常时,就会调用它,您可以在其中生成一个堆栈跟踪,然后保存该跟踪以用于日志记录

编写代码来实现这一点并不完全是琐碎的,但也不是简单的


<>我从来没有亲自在C++中做过,但是如果没有一个准备好的库,如果你没有时间或倾向自己做,我会很惊讶。

你可以用错误发生的地方用描述来抛出异常,为什么:

throw std::string("could not open this file");
如果您不想为每个可能的错误编写不同的描述,可以使用标准宏_文件_和_行_):

#define _MyError std::string("error in " __FILE__ + std::to_string(__LINE__))
// ...
throw _MyError;
若源文件名和错误行不够,并且需要更多信息,例如堆栈跟踪或内存值,则程序可以生成调试报告。谷歌Read是一个C++库,允许您以便携的方式进行。wxWidgets库中的wxDebugReport类是一种替代方法。在Windows上,调试报告可能包含可以在Visual Studio中加载的小型转储文件,并允许您以类似于调试的方式分析错误

删除“包罗万象”并让程序运行不是更好吗 而不是撞车

你可以抓住一切

  • 写一条关于发生的致命错误的(更个人化的)消息,强制关闭应用程序。不要让程序继续:你不知道发生了什么,在哪里。继续操作可能会损坏用户数据、导致后续错误等
  • 告诉用户与您联系,详细说明他们做了什么以及发生了什么
  • 告诉用户包含应用程序生成的日志文件
如果你不做这样的事情,那么你也可以去掉这个包罗万象的东西

出于可读性和实用性的原因,我不想包装 每隔几行代码就分成单独的try/catch块

然而,如果你想让你的程序能够恢复,这正是你必须要做的。你能做的就是

  • 告诉用户发生了什么,可能是输入错误导致的。不要让它听起来像技术性的
  • 保存用户输入的任何数据,以便他们的工作不会完全丢失
  • 你知道失败发生在哪一步。撤消该步骤,即丢弃对象/数据,并返回异常之前的点
  • 恢复用户从第二个点输入的数据,这样他们就不需要再次重复操作

关键是你的程序可以恢复到有效状态。

如果应用程序意外崩溃,对客户来说是不好的,尽管很正常。如果它永远不会崩溃就更好了。而且,catch(…)使调试成为一场噩梦,正如您上面所说的。起初,让客户目睹严重崩溃可能不好,但随着这些情况的报告,他们的频率将越来越低(理论上),直到接近0。@RPGillespie:谢谢,这或多或少也是我的理由。如果我没有错,崩溃是我能找到并修复代码的唯一方法,其中可能会抛出异常。没有任何错误,在一个写得很好的C++程序中会出现一个由零错误或其他逻辑错误引起的错误。这是程序设计马虎的一个标志。@RichardHodges:请详细说明如何保证永远不会出现这样的错误。@RichardHodges:这个问题是关于找到这些东西可能被遗忘的地方。或者异常可能是在库代码中抛出的,而库代码不是由我编写的,因此我无法控制。AddVectoredExceptionHandler看起来很有希望。然而,它并没有很好的文档记录,而且MSDN的示例只针对32位。是否有更好的文档和示例代码可供选择?我发现这些文档足以满足我的需要。如果您有任何疑问,请随时提出具体问题,any和我(或其他人)将尽力提供帮助。请确保您抛出的任何内容都源自
std::runtime\u error
std::logic\u error
。通过抛出并非最终从
std::exception
派生的对象,您可以撤消c++11
头中的所有优秀工作。