2010-03-26 59 views
5

在我學習一種新語言的時候,我通常會把很多愚蠢的println函數看成在特定時間的什麼值。它通常足夠,因爲這些語言通常具有相當於tostring的可用性。在用erlang試用相同的方法時,當試圖打印的值不是列表時,我的web應用程序就會「掛起」。當打印的變量是一個元組而不是一個列表時,會發生這種情況。沒有錯誤,例外,沒有......只是沒有迴應。現在,我正在小心翼翼地處理我寫的內容,隨着我學到更多東西,事情變得越來越好。但我想知道,是否有一種方法可以更可靠地[盲目]將值打印到標準輸出?
謝謝,erlang io:格式和一個掛起的web應用程序

--tim

+5

有些代碼好嗎? – 2010-03-26 13:01:20

+0

請記住,由於Erlang變量是靜態符號,所以您不需要查看它們。這就是Roberto Aloi說追蹤更有效的原因。嘗試編寫代碼,以便在函數中間返回令人震驚的數據庫也不會讓你感到沮喪;將數據收集任務和數據處理任務分開,以便收集的輸出是處理的完整輸入,並且即使使用來自數據庫的瘋狂輸入,您也可以始終知道發生了什麼。 – zxq9 2014-09-10 22:56:41

回答

16

在Erlang中,在其他語言中,你可以打印你的變量,不管他們是一個列表,元組或其他任何東西。

我的感覺是,對於打印,你在做類似(只是猜測):

io:format("The value is: ~p.", A). 

這是錯誤的,因爲你應該傳遞的參數列表:

io:format("The value is: ~p.", [A]). 

其中A可以是任何東西。

我經常發現,使用舒適:

erlang:display/1 

打印變量。

此外,跟蹤功能通常是調試應用程序的更好方法,而不是使用打印輸出。請參閱:

http://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/

2

當開發的webapps我使用error_logger module 我通常這樣定義

-ifdef(debug). 
-define(idbg(FmtStr, Err), 
     error_logger:info_msg("~p (line ~p): " FmtStr "~n", 
           [?MODULE, ?LINE | Err])). 
-define(rdbg(Term), error_logger:info_report(Term)). 
-else. 
-define(idbg(_FmtStr, _Err), void). 
-define(rdbg(_Term), void). 
-endif. 

一些宏您調用宏的東西,如:

code... 
?rdbg(ErlangTerm), 
other code... 

在開發你編譯你的模塊:

erlc -Ddebug *.erl 

所以你可以在你的erlang控制檯中獲得信息消息。

0

此外,請確保沒有鏈接沒有終止進程,然後可能會導致其他進程等待的東西,而不是超時 - 因此奇怪的懸掛部分。