我目前正在为我的 OSS 应用程序添加异常和异常处理。异常从一开始就是一个普遍的想法,但我想找到一个好的异常框架,老实说,在开始使用它们之前更好地理解 C++ 异常处理约定和习语。我在 C#/.Net、Python 和其他使用异常的语言方面拥有丰富的经验。我对这个想法并不陌生(但远非大师)。
在 C# 和 Python 中,当发生未处理的异常时,用户会得到一个很好的堆栈跟踪,通常会得到很多非常有用的无价调试信息。如果您正在开发 OSS 应用程序,那么让用户将该信息粘贴到问题报告中是……好吧,让我们说我发现没有它就很难生活。对于这个 C++ 项目,我得到“应用程序崩溃”,或者来自更知情的用户,“我做了 X、Y 和 Z,然后它崩溃了”。但我也想要调试信息!
我已经(并且非常困难地)接受了这样一个事实,即我永远不会看到获取 C++ 异常堆栈跟踪的跨平台和跨编译器方式,但我知道我可以获得函数名称和其他相关信息。
而现在我想要我未处理的异常。我正在使用boost::exception,他们有这个非常好的diagnostic_information thingamajig 可以打印出(未损坏的)函数名、文件、行,最重要的是,程序员添加到该异常中的其他异常特定信息。
自然,我会尽可能地处理代码中的异常,但我并没有天真地认为我不会让一对夫妇溜走(当然是无意的)。
所以我想要做的是将我的主要入口点包装在一个try
块中,该块catch
创建一个特殊的对话框,通知用户应用程序中发生了错误,当用户单击“更多”或“调试”时显示更详细的信息信息”或其他。这将包含来自诊断信息的字符串。然后我可以指示用户将此信息粘贴到问题报告中。
但是一种烦人的直觉告诉我,将所有内容都包装在 try 块中是一个非常糟糕的主意。我要做的事是愚蠢的吗?如果是(即使不是),有什么更好的方法来实现我想要的?