2010-03-26 33 views
5

Trong khi tôi đang học một ngôn ngữ mới, tôi thường sẽ đặt rất nhiều bản in ngớ ngẩn để xem giá trị nào là ở những thời điểm cụ thể. Nó thường là đủ bởi vì các ngôn ngữ thường có sẵn một chuỗi tương đương. Trong khi thử phương pháp tương tự với erlang, webapp của tôi chỉ "treo" khi có giá trị được cố gắng in không phải là danh sách. Điều này xảy ra khi biến được in là một bộ dữ liệu thay vì danh sách. Không có lỗi, ngoại lệ, không có gì ... chỉ không trả lời. Bây giờ, tôi đang lúng túng bằng cách cẩn thận về những gì tôi đang viết và khi tôi tìm hiểu thêm, mọi thứ đang trở nên tốt hơn. Nhưng tôi tự hỏi, có cách nào đáng tin cậy hơn để [mù quáng] in một giá trị để stdout?
Cảm ơn,erlang io: định dạng và ứng dụng web treo

--tim

+5

Một số mã xin vui lòng? –

+0

Hãy nhớ rằng vì các biến Erlang là các biểu tượng tĩnh, bạn không cần phải kiểm tra chúng. Đây là lý do tại sao Roberto Aloi nói rằng truy tìm là hiệu quả hơn. Hãy thử viết mã để cơ sở dữ liệu gây sốc trở lại ở giữa một chức năng không đi bạn cũng lên; tách các nhiệm vụ thu thập dữ liệu và các nhiệm vụ xử lý dữ liệu sao cho đầu ra của bộ sưu tập là đầu vào đầy đủ để xử lý và bạn luôn có thể biết điều gì đang diễn ra, ngay cả với các đầu vào điên từ db. – zxq9

Trả lời

16

Trong Erlang, như trong các ngôn ngữ khác, bạn có thể in các biến của bạn, không có vấn đề nếu họ là một danh sách, một tuple hoặc bất cứ điều gì khác.

Cảm giác của tôi là, cho in ấn, bạn đang làm một cái gì đó tương tự (chỉ đoán):

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

Đây là sai lầm, bởi vì bạn đang phải vượt qua một danh sách các đối số:

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

Nơi A có thể là bất kỳ thứ gì.

Tôi thường thấy thoải mái khi sử dụng:

erlang:display/1 

để in biến.

Ngoài ra, chức năng theo dõi thường là cách tốt hơn để gỡ lỗi ứng dụng, thay vì sử dụng bản in. Xin vui lòng xem:

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

2

Khi phát triển ứng dụng web tôi sử dụng error_logger module tôi thường xác định một số macro như thế này

-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. 

Bạn gọi các macro với một cái gì đó như:

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

Trong phát triển bạn biên dịch các mô-đun của bạn với:

erlc -Ddebug *.erl 

và vì vậy bạn nhận được thông báo thông tin trong bảng điều khiển erlang của mình.

0

Cũng đảm bảo rằng không có quy trình chấm dứt mà không có liên kết mà sau đó có thể khiến quá trình khác chờ đợi điều gì đó và không phải là thời gian chờ - do đó phần treo lạ.

Các vấn đề liên quan