2009-08-26 8 views
14

मान लीजिए मैं कुछ इस तरह है:इसे पकड़ने के बाद एरलांग में अपवाद स्टैक ट्रेस कैसे लिख सकता हूं?

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

मैं कैच ब्लॉक में स्टैकट्रेस प्रिंट कैसे करूं? वह ब्लॉक सभी अपवादों को पकड़ता है, लेकिन मुझे नहीं पता कि स्टैक को प्रिंट कैसे करें ...

क्या आप मेरी मदद कर सकते हैं?

+0

फ्रांसेस्को, अगर आप जवाब में से एक के साथ संतुष्ट हैं, यह उचित रूप में/चिह्नित करें जवाब – gleber

उत्तर

19

get_stacktrace/0 पर और पढ़ें जो आपको कॉलिंग प्रक्रिया में अंतिम अपवाद का स्टैकट्रैक प्राप्त करने की अनुमति देता है।

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

आपके उदाहरण में, आपको try की आवश्यकता नहीं है; तुम सिर्फ

result = (catch code_that_fails()). 

तो एक अपवाद उठाया है क्या कर सकते हैं, catch एक टपल कि error code and stack trace शामिल देता है।

ध्यान दें कि इसे आम तौर पर खराब अभ्यास माना जाता है क्योंकि यह अपवाद मास्क कर सकता है। दूसरे जवाब में वर्णित स्टैकट्रस दृष्टिकोण लगभग निश्चित रूप से आप चाहते हैं।

try मूल catch कार्यक्षमता का विस्तार है; यदि आप इसका उपयोग करते हैं, तो आपको प्रत्येक अपवाद प्रकार के लिए क्लॉज निर्दिष्ट करना होगा, जिसे आप पकड़ना चाहते हैं, और उन्हें उचित रूप से संभालें। विवरण और स्पष्ट उदाहरणों के लिए Erlang reference manual के अनुभाग 6.18/6.19 देखें।

+2

संतोषजनक बस का उपयोग कर 'catch' आम तौर पर बुरा रूप माना जाता है। यदि आप नहीं जानते कि आप * हर * अपवाद को पकड़ना चाहते हैं, तो शायद आप इसे नहीं चाहते हैं। यह कुछ बग खोजने के लिए बहुत कठिन बना सकता है। –

+1

@ एडम लिंडबर्ग: धन्यवाद - जो डाउनवॉट्स को समझाएगा। मैं अपना जवाब संपादित करूंगा। –

+0

आप सभी के लिए बहुत बहुत धन्यवाद !! :) – Francesco

4

अपने प्रश्न के लिए एक जवाब है:

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

वर्तमान समारोह सूची के सिर पर है। man 3erl erlang या erlang:get_stacktrace/0

संबंधित मुद्दे