假設我有一個功能來執行一個相當不錯的可能性很小的特定任務。處理出錯的最佳方法是什麼? (假設我知道問題是什麼)。處理函數錯誤消息最理想的方法是什麼?
例如可以說我有一個功能,讀取兩個字節的字符串並返回它:
#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(印刷錯誤消息要從函數內標準錯誤):
#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;' – wildplasser
只是爲了便於閱讀? –
不,在bar()函數中,就在「Method2」下的普通泄漏malloc()中。 – wildplasser