首先,我应该给你一些背景信息。所讨论的程序是一个用 C++ 实现的相当典型的服务器应用程序。在整个项目以及所有底层库中,错误管理都是基于 C++ 异常的。
我的问题与处理不可恢复的错误和/或程序员错误有关——“未经检查的”Java 异常的松散等效项,因为需要更好的并行。我对在生产环境中处理此类情况的常见做法特别感兴趣。
特别是对于生产环境,在存在上述类型的错误时,两个相互冲突的目标显得尤为突出:易于调试和可用性(就操作性能而言)。其中每一项都依次提出了具体的策略:
安装顶级异常处理程序来吸收所有未捕获的异常,从而确保持续可用性。不幸的是,这使得错误检查更加复杂,迫使程序员依赖细粒度的日志记录或其他代码“检测”技术。
尽可能猛烈地碰撞;这使得人们能够通过核心转储对导致错误的情况进行事后分析。当然,我们必须提供一种方法让系统在崩溃后及时恢复运行,而这可能绝非小事。
所以我最终得到了两个不成熟的解决方案;我希望在服务可用性和调试设施之间取得折衷。我缺少什么?
注意:我已将问题标记为 C++ 特定问题,因为我对适用于该问题的解决方案和特性感兴趣;尽管如此,我知道与其他语言/环境会有相当大的重叠。