C编程错误处理

sve*_*ven 5 c error-handling pthreads

我希望我的代码能够处理错误情况,例如函数返回失败.例如,pthread_create通常我使用下面的函数:

int thread_check1;
 pthread_t function;
 thread_check1 = pthread_create( &function, NULL, function_function,  NULL);
if(thread_check1 != 0){
   fprintf(stderr, "pthread_create error\n");
   exit(1);
}
Run Code Online (Sandbox Code Playgroud)

考虑到错误情况,调用相同的函数直到它返回0(对于这个特定的函数)是否正确,如下所示?

thread_check1 = pthread_create( &function, NULL, function_function,  NULL);
while(thread_check1 != 0){
    thread_check1 = pthread_create( &function, NULL, function_function,  NULL);
}
Run Code Online (Sandbox Code Playgroud)

我可以将相同的逻辑应用于返回值的其他C函数吗?否则,您如何在不退出程序的情况下建议处理错误情况(函数返回)?

Sha*_*baz 3

可以这样做,但更恰当。假设有一个函数f有不同的返回值。您可以执行以下操作:

tries_left = 1000;
do
{
    ret = f(params);
    if (ret == OK)
        break;
    else if (ret == SOMETHING_UNRECOVERABLE)
        /* break with failure */
    else if (ret == SOMETHING_FIXABLE)
        /* fix params */
    else
        /* sleep a little */
} while (--tries_left);
Run Code Online (Sandbox Code Playgroud)

这里有很多事情需要考虑:

  • 避免无限循环。如果存在本质上的错误,您不想陷入循环。因此,经过一些尝试后,您会想要打破并失败。这就是tries_left发挥作用的地方。
  • 如果无法恢复则失败。如果错误告诉您问题无法修复,请停止尝试。例如,如果您尝试安装驱动器,但它告诉您/dev/sda6不存在,则重试是没有意义的。
  • 尝试实际处理问题。在某些情况下,您也许可以尝试不同的参数。例如,如果您尝试创建备份文件但无法创建,则可以尝试更改文件的目录或名称,然后重试。
  • 不要使用 100% CPU。如果您想重试,至少在两次尝试之间留出一些喘息空间,以便解决任何问题,或者至少避免使用最大 CPU。

最后,为了避免重复自己,如果您有不同的函数需要像这样处理,您可以将整个事情放在一个宏中并像这样调用它CHECK_AND_RETRY(f(params));,假设可以理解什么返回值是不可恢复的以及什么是可修复的无论功能如何(有点限制,但没有完美的解决方案)。