gpt4 book ai didi

c - 处理函数错误消息的最佳方式?

转载 作者:行者123 更新时间:2023-12-05 01:33:59 25 4
gpt4 key购买 nike

假设我有一个函数可以执行一个小而特殊的任务,该任务很可能会失败。处理出错的最佳方法是什么? (假设我知道问题出在哪里)。

例如,假设我有一个读取两字节字符串并返回它的函数:

#include <stdio.h>
#include <stdlib.h>

char *bar(void)
{
char *foo = malloc(3);
scanf("%2s", foo);
return foo;
}

int main(void)
{
char *foo = bar();
puts(foo);
free(foo);
return 0;
}

上面的例子完全没有任何错误处理。有两种方法可以实现某种错误处理,但我不确定哪种方法更受欢迎或被认为是最佳实践。

方法 1(从函数内部向 stderr 打印错误消息):

#include <stdio.h>
#include <stdlib.h>

char *bar(void)
{
char *foo;
if(!(foo = malloc(3)))
{
fputs("\nError! Memory allocation failed.", stderr);
return 0x00;
}
scanf("%2s", foo);
return foo;
}

int main(void)
{
char *foo;
if(!(foo = bar())) return 1;
puts(foo);
free(foo);
return 0;
}

方法 2(从调用函数向 stderr 打印错误消息):

#include <stdio.h>
#include <stdlib.h>

char *bar(void)
{
char *foo;
if(!(foo = malloc(3))) return 0x00;
scanf("%2s", foo);
return foo;
}

int main(void)
{
char *foo;
if(!(foo = bar()))
{
fputs("\nError! Memory allocation failed.", stderr);
return 1;
}
puts(foo);
free(foo);
return 0;
}

我几乎认为方法二是最好的方法,因为这样我可以根据我当时调用该函数的目的来更具体地处理错误消息。对于方法二,我担心的是,如果函数有多个潜在故障点,我将无法打印函数中具体出错的地方。

伪代码:

 IF FAILUREA
PRINT "FAILUREA OCCURED"
RETURN
IF FAILUREB
PRINT "FAILUREB OCCURED"
RETURN

如果我调用的函数是一个int,这就不是什么大问题,因为这样我就可以根据出错的地方返回一个不同的整数值。但在 char* 的情况下,我通常会尝试在失败时返回 NULL(因此 FAILUREAFAILUREB将返回 NULL);没有办法知道是什么导致函数失败。

所以我的问题是,在处理错误消息时最佳做法是什么?

最佳答案

允许调用者处理错误报告更好,因为:

  • 如果该函数构成库的一部分,stderr 可能不可用,并且需要替代报告机制。
  • 调用代码可能有一个可以采取的替代操作,并且可能不会将函数 bar() 的失败视为实际失败并且不需要报告它。

如果一个函数有多个可能的失败原因,那么一种可能性是将参数传递给在失败事件中更新的函数。然后调用函数可以根据实际失败原因选择适当的操作。例如:

enum Status
{
STATUS_OK,
STATUS_MEMORY_ALLOCATION_FAILURE,
STATUS_ACCESS_DENIED
};

enum Status status;
char* foo = bar(&status);
if (!foo)
{
if (STATUS_MEMORY_ALLOCATION_FAILURE == status)
{
/* report failure. */
}
else if (STATUS_ACCESS_DENIED == status)
{
/* try somewhere else */
}
}

关于c - 处理函数错误消息的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com