【发布时间】:2012-09-30 23:39:16
【问题描述】:
假设我有一个函数来执行一个小而特定的任务,该任务很有可能失败。处理出错的最佳方法是什么? (假设我知道问题是什么)。
例如,假设我有一个读取两个字节字符串并返回它的函数:
#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;
}
上面的例子绝对没有任何错误处理。有两种方法可以实现某种错误处理,但我不确定哪种方法更受欢迎或被认为是最佳实践。
方法一(从函数内部向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(因此FAILUREA 和FAILUREB 都会返回NULL);没有办法知道导致函数失败的原因。
所以我的问题是处理错误消息时的最佳做法是什么?
【问题讨论】:
-
if(!(foo=malloc(3))) return 0; -
不,在 bar() 函数中,就在“Method2”下 普通泄漏 malloc()。
-
首先,您的
malloc没有在任何地方分配该内存......所以无论如何它都是泄漏......但是这里的错误处理非常主观。这完全取决于您要在哪里处理错误(或者如果您在 Linux 内核中编程,他们喜欢让它崩溃以获取回溯!)就我个人而言,我更喜欢在错误发生的函数中处理它保持我的main()干净,但这完全取决于你。 -
@wildplasser 哦,是的,哇哦,我只是在飞行中写的,我现在会更正它,感谢迈克的输入,我很感激。
标签: c function error-handling return-value stderr