2014-09-30 47 views
1

這是一個基本問題,但我找不到一個好的答案。當我需要使用stderr嗎?重要的錯誤或所有錯誤?

例如,如果我使用malloc,我檢查malloc,如果我看到了一個錯誤,我可以做:

fprintf(stderr, "Message"); 

這是一個重要的錯誤信息時,輸出爲上stderr

現在,如果我有一個程序,誰的1到5之間問號碼的程序要求的用戶,直到他進入好一些。

如果用戶輸入10,例如,是不是好東西重定向到錯誤消息stderr

fprintf(stderr, "Message, wrong number, try again"); 

或者這是一個正常的錯誤,消息應該繼續stdout

+0

正確拼寫'stderr'相當重要。 – usr2564301 2014-09-30 22:11:04

+0

@Jongware thx ^^' – mpgn 2014-09-30 22:12:37

+0

建議避免做'fprintf(stderr,「消息,錯誤的數字,再試一次」);'消息是fscanf()'的格式。最好只使用'fputs(「消息,錯誤號碼,再試一次」,stderr);' – chux 2014-09-30 22:21:56

回答

0

請記住,標準錯誤不是關於錯誤,而是關於診斷。任何診斷消息(包括調試模式通知和花哨的進度條)都應該轉到stderr,而所有的交互,無論是用戶還是其他程序,都應該使用stdout。 stderr通常連接到終端,而標準輸出可能是shell管道的一部分(因此不可見)。並且沒有辦法將stderr與stdout分開連接到下一個程序。

關於你的情況,關於錯誤號碼的消息顯然是交互的一部分,所以使用stdout。將主動對話轉移到其他流是一個壞主意。但是,如果用戶/對等進程不打算讀取並作出反應,而只是診斷/調試程序的人的信息,則使用stderr。

+2

可以單獨重定向標準錯誤輸出。你的shell可能不會提供一個方便的語法,但是從操作系統(或者C程序員就此而言)的角度來看,它當然可以完成。 – 5gon12eder 2014-10-01 00:10:20

+0

@ 5gon12eder當然,在創建另一個進程之前,可以創建任意數量的管道。但是你沒有任何標準可以涵蓋這個標準,以及stderrin或其他任何名稱。 – user3125367 2014-10-01 00:15:28

+0

聲稱「stderr總是連接到終端」是錯誤的。 – 5gon12eder 2014-10-01 00:17:22

3

如果您不希望要重定向某些類型的獨立於其他所有輸出的錯誤,把他們送到stderr

否則,我認爲它是整個程序中保持一致,因此決定是很重要的東西去的地方,並堅持下去。

2

這取決於你如何以及何時決定使用它。

常見的應用是從任何形式的通知,是不是輸出的一部分程序輸出的分離,無論是錯誤或只是進展,以便用戶知道程序沒有掛什麼的。

我有,例如,該獲取數據的多個表以XML格式從Web服務器,轉換並生成SQL轉儲作爲輸出,所以可直接將它傳遞給命令mysql,如在my_importer | mysql -options一個代碼。在運行過程中,程序輸出反饋給stderr,這樣我就知道它的工作原理以及它迄今爲止的輸入。

0

對於像你正在討論的交互式程序,我不認爲它有很大的不同。如果程序不能用於標準輸出和/或重定向的標準錯誤,那麼也可以簡化並使用標準輸出來提示和診斷。

話雖如此,有很多場景中重定向是有道理的,甚至是必要的一些使用情況下正常工作。如果有任何可以想象的方式可以這樣使用程序,那麼確保標準輸出只包含實際生產輸出並且其他一切都達到標準錯誤是非常重要的。