2011-12-21 5 views
11

मैं loch (और इसके पूर्वप्रक्रमक) को बदलने के लिए है, क्योंकि यह GHC साथ 7.मैं उस स्थिति को कैसे प्राप्त कर सकता हूं जहां त्रुटि कहलाती थी?

विशेष रूप से, अगर error कहा जाता है तो मैं यह पता लगाने चाहते हैं, के रूप में आसानी से संभव है, जहां यह रूप में संकलित नहीं है कुछ के लिए देख रहा हूँ से कहा गया था (लाइन नंबर और स्टैक ट्रेस अच्छा होगा)।

+0

आप वास्तव में नियंत्रित नहीं कर सकते जहां या जब अन्य पुस्तकालयों का उपयोग 'error', लेकिन मेरे अपने कोड के लिए मेरे निजी पसंद है जितना संभव हो सके 'त्रुटि' से बचें। इसे पढ़ने के लिए सामान्य सलाह के रूप में, यदि आपको यह जानने की आवश्यकता है कि कोड निष्पादन की एक विशेष शाखा क्यों ले रहा है, * स्टैक ट्रेस खोजने के लिए * त्रुटि 'का उपयोग न करें; अभी सबसे अच्छा तरीका शायद 'Debug.Trace' है। –

+0

@ डैनबर्टन मुझे नहीं लगता कि यह उस पर लागू होता है जो मैं पूछ रहा हूं। मान लें कि मैं अपने प्रोग्राम को निष्पादित करता हूं और अप्रत्याशित रूप से मुझे '*** अपवाद: Prelude.head: खाली सूची 'मिलता है, अब मैं जानना चाहता हूं कि इस त्रुटि को उत्पन्न करने वाले सिर को कॉल करने के लिए स्रोत कोड में है। – HaskellElephant

+0

मेरे पास ghc के लिए एक पैच है जो इसे जोड़ता है। मुझे इसे मर्ज करने की ज़रूरत है। – augustss

उत्तर

12

पर वर्णित अनुसार आप -xc आरटीएस विकल्प का उपयोग कर सकते हैं; आपको प्रोफाइलिंग समर्थन के साथ अपने प्रोग्राम को संकलित करने की आवश्यकता है, और आउटपुट बहुत बदसूरत है, लेकिन यह काम करता है।

यह करना चाहिए:

$ ghc --make -prof -auto-all myprog.hs 
$ ./myprog +RTS -xc 

तकनीकी तौर पर यह केवल एक लागत केंद्र ढेर, नहीं एक सच्चे स्टैक ट्रेस देता है। बेहतर स्टैक ट्रेस समर्थन coming in GHC 7.4 है।

5

यदि यह कोड में उपयोग के लिए है, तो आप टेम्पलेट हास्केल का उपयोग करके सहन कर सकते हैं, the placeholders package ऐसा कुछ करने का एक प्यारा और सरल तरीका है। यह वास्तविक error अभिव्यक्तियों का स्थान ढूंढने में आपकी सहायता नहीं करेगा, हालांकि, केवल अपने error-जैसे कार्यों का उपयोग करता है।

5

जीएचसी -7 के साथ इसे बनाने के लिए यह बहुत छोटा है। यह Control.Exception परिवर्तन है जो 6.12 के साथ आया था, सरल फिक्स ExceptionSomeExceptionDebug.Trace.Location में टाइप करें, लाइन 70 में अभिव्यक्ति प्रकार हस्ताक्षर जोड़ें और base निर्भरता >= 4.2 && < 4.6 को .cabal फ़ाइल में प्रतिबंधित करें (टक्कर दें संस्करण) और आप जाने के लिए अच्छे हैं।

3

नियंत्रण-अपवाद से assert फ़ंक्शन एक त्वरित-गंदे कामकाज है। हालांकि, यह error से थोड़ा छोटा है।

चेतावनी: यदि आप अनुकूलन (ghc -O1, -O2, आदि) के साथ संकलन सभी इस बात पर ज़ोर चुपचाप नजरअंदाज कर दिया जाएगा।

उदाहरण:

import Control.Exception 

main = do 
    print (42 + (assert True 17)) -- adds 42 and 17 
    print (42 + (assert False 21)) -- crashes 

आउटपुट:

59 
test.hs: /tmp/test.hs:5:18-23: Assertion failed 

नोट लाइन नंबर "5" उत्पादन में।

आप Debug.Trace से trace इस्तेमाल कर सकते हैं एक त्रुटि संदेश को जोड़ने के लिए:

print (42 + (trace "omg error" $ assert False 21)) 
संबंधित मुद्दे

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