C 编程错误处理

标签 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);
}

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

thread_check1 = pthread_create( &function, NULL, function_function,  NULL);
while(thread_check1 != 0){
    thread_check1 = pthread_create( &function, NULL, function_function,  NULL);
}

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

最佳答案

可以那样做,但更恰当。假设有函数 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);

这里有很多事情要考虑:

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

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

关于C 编程错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160873/

相关文章:

c# - 如何在多层应用程序中向用户显示异常详细信息以供解决

php - 为什么 PHP 错误处理 PHP 并不总是有效?

c++ - 是否需要分离 pthread 以防止内存泄漏?

c++ - pthread_cond_wait() 能否始终赢得锁定互斥体的竞争?

c - 迭代DFS算法与递归不匹配

自定义结构返回函数停留在输入上?

c - ptrace(PTRACE_PEEKUSER) 和 ptrace(PTRACE_PEEKDATA) 之间的区别?

javascript - Mongodb 与和尚 : error catching and handling if db is down

c - assert(0 == pthread_mutex_destroy(&lock)); 的含义是什么?

c - 遍历 2D 矩阵冒泡排序 C