假设我有一个功能可以执行一个很小的特定任务,该任务很有可能失败。处理出错的最佳方法是什么?(假设我知道问题是什么)。
例如,假设我有一个读取两个字节字符串并返回它的函数:
#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
如果我调用的函数是 an,这不会有太大问题,int
因为那时我可以根据错误返回一个不同的整数值。但是在 a 的情况下,char*
我通常会尝试NULL
在失败时返回(所以两者FAILUREA
都会FAILUREB
返回NULL
);没有办法知道导致该功能失败的原因。
所以我的问题是处理错误消息时的最佳实践是什么?