2009-08-26 36 views
14

Giả sử tôi có một cái gì đó như thế này:Làm thế nào tôi có thể viết một dấu vết ngăn xếp ngoại lệ trong erlang sau khi bắt nó?

try code_that_fails() 
catch _:_ -> ..... 

Làm thế nào để in các stacktrace trong khối catch? Khối đó bắt tất cả ngoại lệ, nhưng tôi không biết cách in ngăn xếp ...

Bạn có thể giúp tôi không?

+0

Francesco, nếu bạn hài lòng với một trong các câu trả lời, vui lòng đánh dấu câu trả lời phù hợp/thỏa mãn – gleber

Trả lời

19

xem get_stacktrace/0 cho phép bạn nhận được stacktrace của ngoại lệ cuối cùng trong quá trình gọi.

try 
    code_that_fails() 
catch 
    _:_ -> 
     erlang:display(erlang:get_stacktrace()) 
end 
4

Trong ví dụ của bạn, bạn không cần try; bạn chỉ có thể làm

result = (catch code_that_fails()). 

Nếu một ngoại lệ được nâng lên, catch trả về một tuple chứa error code and stack trace.

Lưu ý rằng điều này thường được coi là hành vi xấu vì nó có thể che giấu ngoại lệ. Cách tiếp cận stacktrace được mô tả trong câu trả lời khác gần như chắc chắn là những gì bạn muốn.

try là phần mở rộng của chức năng gốc catch; nếu bạn sử dụng nó, bạn cần xác định các mệnh đề cho từng loại ngoại lệ mà bạn muốn nắm bắt và xử lý chúng một cách thích hợp. Xem các phần 6.18/6.19 của Erlang reference manual để biết chi tiết và các ví dụ rõ ràng.

+2

Chỉ sử dụng 'catch' thường được coi là biểu mẫu không hợp lệ. Nếu bạn không biết rằng bạn muốn bắt * mọi ngoại lệ, có thể bạn không muốn nó. Nó có thể làm cho một số lỗi khó tìm hơn. –

+1

@Adam Lindberg: Cảm ơn - điều đó sẽ giải thích các downvotes. Tôi sẽ chỉnh sửa câu trả lời của mình. –

+0

Cảm ơn rất nhiều đến tất cả các bạn !! :) – Francesco

4

Một câu trả lời cho câu hỏi của bạn là:

io:format("Backtrace ~p~n", [erlang:get_stacktrace()]) 

Chức năng hiện nay là ở phần đầu của danh sách. Đọc thêm trong man 3erl erlang hoặc erlang:get_stacktrace/0

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