Debugging 分级调试和错误处理的良好实践

Debugging 分级调试和错误处理的良好实践,debugging,error-handling,coding-style,Debugging,Error Handling,Coding Style,对于调试我的代码(低级问题),我希望使用不同级别的调试,以改变我的代码拒绝某些东西的难度。到目前为止,我一直在使用这样的东西: enum error_level { el_neglegable = 0, el_notable_to_log = 10, el_notable_to_print = 100, el_terminate_program = 1000, /* you can fragment the levels even more, of cou

对于调试我的代码(低级问题),我希望使用不同级别的调试,以改变我的代码拒绝某些东西的难度。到目前为止,我一直在使用这样的东西:

enum error_level
{
    el_neglegable = 0,
    el_notable_to_log = 10,
    el_notable_to_print = 100,
    el_terminate_program = 1000,
    /* you can fragment the levels even more, of course */
};

void inline process_error( error_level error )
{
    if( error >= el_notable_to_print ) printf("A notable error has occured!\n");
    if( error >= el_terminate_program ) exit();
    /* you can build in more queries like this, of course */
}
这只是主题的一个变体,但现在你已经了解了我的意思。我想了解使用不同级别调试的更好实践,这取决于我希望从程序中删除错误的程度


问题:为了实现更易于维护的代码并允许这种调试模型,您是否知道良好的指导原则、实践等?

能够描述错误条件绝对有价值,但以严重性或采取的行动来描述它们意味着决策是由错误的代码段做出的

我这样说的原因是遇到错误的方法缺少上下文

考虑套接字连接打开失败的情况。您希望socket.open(主机、端口)返回何种错误严重性?根据上下文,您可能会:

  • 静默重试
  • 记录并重试
  • 向用户抛出一个对话框
  • 尝试列表中的其他连接
  • 终止程序
对错误采取什么行动的决定完全取决于上下文——当某个特定错误发生时,它意味着什么

出于这个原因,大多数人现在都遵循一种模型,在这种模型中,遇到错误的方法会报告该错误,并允许调用方确定要采取的操作

因此,您不需要考虑严重性级别,而是需要一组错误条件,调用方要么采取操作,要么返回错误本身(不一定是相同的错误)

在这种情况下,
socket.open(host,port)
将产生类似于
socket\u open\u fails
的错误,调用方将有上下文知道当socket open失败时该做什么。它将知道套接字是否用于获取重要数据,如果没有这些数据,程序将无法继续,或者是更可选的(可能用于获取程序更新)

所以:不要用要采取的行动来定义错误条件:用失败的东西来定义它们



作为旁注,我花了很多时间来写这篇文章,在描述这一切时没有提到例外

这不是异常的用途吗?您可以重新表述异常中的所有代码,但这与问题完全无关。为了避免含糊不清,我将把这句话说清楚。这不是一个C++问题。所以你真的在问,根据错误的严重程度来描述错误条件的类型是否是个好主意?好的,我可以这么说。额外投票支持不依赖例外的概念。感谢你富有洞察力的回答!