繁体   English   中英

C ++:我应该捕获所有异常还是让程序崩溃?

[英]C++: Should I catch all exceptions or let the program crash?

我有一个用(Visual)C ++编写的Windows服务,它具有非常详细的日志记录功能,经常帮助我找到客户有时遇到的错误原因。 基本上我检查每个返回值并记录发生了什么以及错误来自哪里。

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

我今天拥有的是一个通用的捕获所有捕获所有内容并在关闭程序之前记录错误。 从用户的角度来看这很好 - 干净关闭而不是应用程序崩溃 - 但对我来说不好,因为我只从异常中获取一般信息(例如“数组超出范围”),但不知道它来自何处。

是不是更好的删除catch-all并让程序崩溃? 我可以直接客户有Windows创建一个应用程序崩溃转储(如描述在这里 )。 使用转储文件,WinDbg会指向我到代码中抛出异常的位置。

您可以通过调用AddVectoredExceptionHandler来注册自定义的向量异常处理程序。

每当抛出异常时都会调用它,并且在其中您可以生成堆栈跟踪,然后可以将其保存以用于记录目的。

编写代码来做到这一点并非完全无足轻重,但也不是火箭手术。

我从来没有亲自用C ++完成它,但是如果没有现成的库可以在某个地方使用它,如果你没有时间或倾向于自己做,我会感到惊讶。

您可以抛出异常,其中包含错误发生的描述以及原因:

throw std::string("could not open this file");

如果您不想为每个可能的错误编写不同的描述,可以使用标准宏__FILE__和__LINE__:

#define _MyError std::string("error in " __FILE__ + std::to_string(__LINE__))
// ...
throw _MyError;

如果源文件名和错误行不够,并且您需要更多信息,例如堆栈跟踪或内存值,则程序可以生成调试报告。 Google Breakpad是一个C ++库,允许您以便携方式执行此操作。 来自wxWidgets库的类wxDebugReport是另一种选择。 在Windows上,调试报告可能包含一个可以在Visual Studio中加载的minidump文件,并允许您以类似于调试的方式分析错误。

是不是更好的删除catch-all并让程序崩溃?

你可以全力以赴

  • 写一个(更个人的)有关发生的致命错误的消息,强制关闭应用程序。 不要让程序继续:你不知道发生了什么,在哪里。 继续可能会导致用户数据损坏,跟进错误等。
  • 告诉用户与您联系,详细说明他们做了什么以及发生了什么。
  • 告诉用户包含应用程序生成的日志文件。

如果你不做这样的事情,那么你也可以删除全部。

出于可读性和实用性的原因,我不想将每几行代码包装到单独的try / catch块中。

然而,如果您希望您的程序能够恢复,这正是您必须要做的。 你能做的是

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

关键是您的程序可以返回有效状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM