2013-03-08 14 views
5

क्या होता है कि यदि आपका कोड रनटाइम अपवाद उठाता है और आपका पूरा काम नहीं करता है, तो आपको पता नहीं है कि क्यों ट्रेसबैक मुद्रित नहीं होता है। मेरा मतलब यह देखने के लिए इस बहुत कम कोड को आज़माएं: प्रोग्राम लाइन सी = 2+ "डीडीडीए" पर क्रैश होना चाहिए, जाहिर है आप एक स्ट्रिंग और एक int जोड़ रहे हैं, जो बस काम नहीं करता है। लेकिन दुर्घटनाग्रस्त होने की बजाय, अपवाद पकड़ा गया है और आपको पता नहीं है कि क्या हो रहा है। कार्यक्रम चल रहा है जैसे कुछ भी खुश नहीं है।cmd पायथन मॉड्यूल का उपयोग करते समय मैं अपने प्रोग्राम को कैसे ठीक से क्रैश कर सकता हूं?

import cmd 

class App(cmd.Cmd): 
    def complete_foo(self,*arg): 
     # Uncommenting this line will silently crash the progrm 
     # making it hard to debug. 
     # Is there a way to force the program to crash ? 
     c = 2 + "ddda" 
     return "d dzpo idz dza dpaoi".split(" ") 

    def do_foo(self,*args): 
     print "foo" 
App().cmdloop() 

मेरा प्रश्न है: त्रुटि को दिखाने के लिए कैसे जब वहाँ एक है? (cmd मॉड्यूल का उपयोग करते समय)।

+0

यदि कोड को 'प्रयास' ब्लॉक के भीतर नहीं कहा जाता है जो त्रुटि को संभालता है, तो उसे एक त्रुटि और ट्रेसबैक से रोकना चाहिए। – Barmar

उत्तर

5

दुर्भाग्य से, readline की अंधेरे गहराई के अंदर कहीं भी अपवादों में अपवाद पकड़े जाते हैं। आप ऐसा ही कुछ करने की कोशिश कर सकते हैं:

import cmd 
import traceback 

def log_exceptions(fun): 
    def wrapped(*a, **kw): 
     try: 
      return fun(*a, **kw) 
     except Exception: 
      print traceback.format_exc() 
      raise 

    return wrapped 

class App(cmd.Cmd): 
    @log_exceptions 
    def complete_foo(self,*arg): 
     # Uncommenting this line will silently crash the progrm 
     # making it hard to debug. 
     # Is there a way to force the program to crash ? 
     c = 2 + "ddda" 
     return "d dzpo idz dza dpaoi".split(" ") 

 

$ python c.py 
(Cmd) foo Traceback (most recent call last): 
    File "c.py", line 7, in wrapped 
    return fun(*a, **kw) 
    File "c.py", line 20, in complete_foo 
    c = 2 + "ddda" 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

, अपने completers डिबगिंग के बाद डेकोरेटर निकालें क्योंकि ReadLine अंदर से ट्रेस बैक मुद्रण गंदगी अपने टर्मिनल अप कर सकते हैं।

 

नहीं, आप ReadLine आसानी से दुर्घटना नहीं कर सकते।

+0

धन्यवाद। मुझे आपका समाधान पसंद है। मैंने cmd मॉड्यूल में एक कोशिश/पकड़ ब्लॉक की खोज की है और कुछ भी संदिग्ध नहीं मिला है। रीडलाइन के बारे में आपकी व्याख्या एक उचित सुराग और सजावटी एक व्यावहारिक समाधान लगता है। एक बार फिर धन्यवाद। – ychaouche

+0

इसके अलावा, traceback.print_exc() एक और शॉर्टेंड है यदि कोई भी करना चाहता है तो ट्रेसबैक प्रिंट करें। – ychaouche

+0

यह 'stderr' पर प्रिंट करता है, जो रीडलाइन भी स्पष्ट रूप से दबा देता है। –

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

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