【发布时间】:2014-11-29 00:12:03
【问题描述】:
我有一个用 (Visual) C++ 编写的 Windows 服务,它具有非常详细的日志记录功能,它经常帮助我找到客户有时遇到的错误的原因。基本上我检查每个返回值并记录发生了什么以及错误来自哪里。
理想情况下,我希望对异常(如数组超出范围、除以零等)具有相同级别的详细可见性。换句话说:我想确切地知道异常来自哪里。出于可读性和实用性的原因,我不想将每几行代码都包装到单独的 try/catch 块中。
我今天拥有的是一个通用的包罗万象的方法,它可以捕获所有内容并在关闭程序之前记录错误。从用户的角度来看,这很好 - 干净关闭而不是应用程序崩溃 - 但对我来说很糟糕,因为我只从异常中得到一般消息(例如“数组超出范围”),但不知道它来自哪里。
去掉catch-all 并让程序崩溃不是更好吗?我可以指示客户让Windows 创建应用程序崩溃转储(如here 所述)。使用转储文件,WinDbg 会准确地指向代码中引发异常的位置。
【问题讨论】:
-
如果应用程序意外崩溃,这对客户不利,尽管这很正常。如果它永远不会崩溃,那就更好了。而且,如上所述,catch(...) 使调试成为一场噩梦。最初,让客户目睹严重崩溃可能很糟糕,但随着这些事件被报告,它们将变得越来越少(理论上),直到它接近 0。
-
@RPGillespie:谢谢,这或多或少也是我的理由。如果我没记错的话,崩溃是我找到并修复可能引发异常的代码区域的唯一方法。
-
在编写良好的 c++ 程序中,没有任何理由可以引发除以零错误或其他逻辑错误。这是程序设计草率的指标。
-
@RichardHodges:请详细说明如何保证永远不会出现这样的错误。
-
@RichardHodges:这个问题是关于寻找这些东西可能被遗忘的地方。或者在不是我编写的库代码中可能引发了异常,因此我无法控制。
标签: c++ windows exception crash minidump