2012-07-20 8 views
31

मैं उपयोगकर्ता से स्टैक ट्रेस के अनावश्यक हिस्सों को छिपाने के लिए AssertionError दोनों को संभालना चाहता हूं और एक संदेश प्रिंट करने के लिए कि त्रुटि क्यों हुई और उपयोगकर्ता को इसके बारे में क्या करना चाहिए।पायथन में AssertionError को कैसे संभालें और यह पता लगाएं कि यह किस पंक्ति या कथन पर हुआ?

क्या ब्लॉक के भीतर विफल होने पर कोई लाइन या कथन पाने का कोई तरीका है? क्योंकि यह जानकारी दोहराता

assert 7 == 7, "7 == 7" 

:

try: 
    assert True 
    assert 7 == 7 
    assert 1 == 2 
    # many more statements like this 
except AssertionError: 
    print 'Houston, we have a problem.' 
    print 
    print 'An error occurred on line ???? in statement ???' 
    exit(1) 

मैं नहीं चाहता कि हर ज़ोर बयान में जोड़ने के लिए है।

+7

दो मुद्दे। सबसे पहले, अगर आपको यह पहचानने में समस्या हो रही है कि आपके 'try..except' में अपवाद कहां हो रहा है, तो यह एक संकेत है कि आपका' try..except' ब्लॉक बहुत बड़ा है। दूसरा, 'assert' द्वारा पकड़ा जाने वाला मतलब ऐसी चीज नहीं है जिसे उपयोगकर्ता कभी देखना चाहिए। यदि वे 'AssertionError' देखते हैं, तो उनके लिए प्रोग्रामर से संपर्क करने और "डब्ल्यूटीएफ ?!" कहने का उचित तरीका है। –

+2

@ जॉन वाई, आप उलझन में लग रहे हैं। आप कह रहे हैं कि उपयोगकर्ता द्वारा AssertionError को नहीं देखा जाना चाहिए, और उसके बाद उपयोगकर्ता को एक को देखने पर क्या करना चाहिए। यह दोनों नहीं हो सकता! – devtk

+3

बीटीडब्ल्यू: आवेषण आपके कोड की संरचना के बारे में होना चाहिए, यानी, अगर आपके सॉफ़्टवेयर में कोई बग है तो एक जोर केवल तभी विफल होना चाहिए। उन्हें उपयोगकर्ता इनपुट की जांच करने के लिए उपयोग नहीं किया जाना चाहिए। आप इस एप्लिकेशन के लिए एक अलग अपवाद का उपयोग करने पर विचार कर सकते हैं। –

उत्तर

47

traceback मॉड्यूल का उपयोग करें:

import sys 
import traceback 

try: 
    assert True 
    assert 7 == 7 
    assert 1 == 2 
    # many more statements like this 
except AssertionError: 
    _, _, tb = sys.exc_info() 
    traceback.print_tb(tb) # Fixed format 
    tb_info = traceback.extract_tb(tb) 
    filename, line, func, text = tb_info[-1] 

    print('An error occurred on line {} in statement {}'.format(line, text)) 
    exit(1) 
1

ट्रैस बैक मॉड्यूल और sys.exc_info एक अपवाद के स्रोत पर नज़र रखने के लिए overkill है। यह सब डिफ़ॉल्ट ट्रेसबैक में है।

try: 
    assert "birthday cake" == "ice cream cake", "Should've asked for pie" 
except AssertionError: 
    print 'Houston, we have a problem.' 
    raise 

निम्नलिखित में से कौन उत्पादन है कि हमलावर बयान और लाइन नंबर शामिल हैं देता है::

Houston, we have a problem. 
Traceback (most recent call last): 
    File "/tmp/poop.py", line 2, in <module> 
    assert "birthday cake" == "ice cream cake", "Should've asked for pie" 
AssertionError: Should've asked for pie 

इसी लॉगिंग मॉड्यूल यह लॉग इन करने के लिए आसान बनाता है तो बजाय बाहर निकलें बुला (1) बस फिर से बढ़ाने की किसी भी अपवाद के लिए एक ट्रेसबैक (जिसमें पकड़े गए हैं और कभी भी उठाए गए नहीं हैं):

import logging 

try: 
    assert False == True 
except AssertionError: 
    logging.error("Nothing is real but I can't quit...", exc_info=True) 
संबंधित मुद्दे