水平调试和错误处理的良好实践

时间:2011-04-19 10:36:31

标签: 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 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 */
}

这只是主题的变体,但现在你有了我的意思。我想学习更好的实践来采用不同级别的调试,具体取决于我想从程序中删除多少错误。

问题:为了获得更易维护的代码并允许这样的调试模型,您是否了解良好的指南,实践等?

1 个答案:

答案 0 :(得分:1)

能够表征错误条件是绝对有价值的,但是通过严重性或行动来表征它们意味着决定是由错误的代码组成的。

我说这个的原因是遇到错误的方法缺乏上下文。

考虑套接字连接打开失败的情况。您希望socket.open(主机,端口)返回什么错误严重性?根据具体情况,您可以:

  • 默默地重试
  • 记录并重试
  • 向用户投掷对话框
  • 在列表中尝试其他连接
  • 终止程序

对错误采取什么操作的决定完全取决于上下文 - 当发生特定错误时它意味着什么。

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

因此,不要考虑严重性级别,而是要有一组错误条件,调用者要么采取行动,要么自己返回错误(不一定是相同的错误)。

在这种情况下,socket.open(host,port)会产生类似socket_open_fails的错误,并且调用者会有上下文知道当套接字打开失败时该怎么做。它将知道套接字是否用于获取重要数据,如果程序无法继续,或者更可选(可能是为了获得程序更新)。

所以:不要通过要采取的行动来定义你的错误条件:通过失败来定义它们。


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