अपवाद का नाम कैसे प्राप्त करें जो पायथन में पकड़ा गया था?


122

मैं एक अपवाद का नाम कैसे प्राप्त कर सकता हूं जो पायथन में उठाया गया था?

जैसे,

try:
    foo = bar
except Exception as exception:
    name_of_exception = ???
    assert name_of_exception == 'NameError'
    print "Failed with exception [%s]" % name_of_exception

उदाहरण के लिए, मैं कई (या सभी) अपवादों को पकड़ रहा हूं, और एक त्रुटि संदेश में अपवाद का नाम प्रिंट करना चाहता हूं।


3
आपको क्या लगता है कि आपको इसकी आवश्यकता क्यों है? except NameError:शुरू करने के लिए अधिक ठोस अपवाद (जैसे ) क्यों नहीं पकड़ा गया?

7
मेरे पास दो परिदृश्य हैं जहां मैं सभी अपवादों (या उनमें से एक सूची) को पकड़ना चाहता हूं, और एक त्रुटि संदेश में अपवाद का नाम प्रिंट करना चाहता हूं।
रोब बेडनार्क

1
आप मानक पुस्तकालय के tracebackमॉड्यूल की जांच करना चाहते हैं , जिसमें ऐसे कार्य हैं जो अपवादों और ट्रेसबैक की कुछ अच्छी प्रारूपण करते हैं।
ब्लेकन्थ

1
@delnan यह स्थिति तब उत्पन्न होती है जब आप परीक्षण कर रहे होते हैं कि क्या कोई फ़ंक्शन
क्रमबद्ध

मुझे कुछ इस तरह की आवश्यकता थी कुछ कोड को DRY करने के लिए: मेरे द्वारा कॉल की जा रही विधि द्वारा कई अपवाद उठाए जा सकते हैं, प्रत्येक को अपने स्वयं के exceptकथन के साथ नियंत्रित किया जाता है , लेकिन लॉग प्रविष्टि प्रत्येक मामले में बहुत समान है।
एडम कैरोल

जवाबों:


224

अपवाद के वर्ग का नाम पाने के लिए कुछ अलग तरीके हैं:

  1. type(exception).__name__
  2. exception.__class__.__name__
  3. exception.__class__.__qualname__

जैसे,

try:
    foo = bar
except Exception as exception:
    assert type(exception).__name__ == 'NameError'
    assert exception.__class__.__name__ == 'NameError'
    assert exception.__class__.__qualname__ == 'NameError'

6

यह काम करता है, लेकिन ऐसा लगता है कि एक आसान, अधिक प्रत्यक्ष तरीका होना चाहिए?

try:
    foo = bar
except Exception as exception:
    assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
    name = repr(exception).split('(')[0]
    assert name == 'NameError'

4
except Exception as exceptionअपवाद के प्रकार से बदलें जिसे आप पकड़ना चाहते हैं, अर्थात except NameError as exception
मैकीज गोल

8
मैं पहले से ज्ञात विशेष अपवादों को नहीं पकड़ना चाहता। मैं सभी अपवादों को पकड़ना चाहता हूं ।
रॉब बेडनर्क

3

आप भी इस्तेमाल कर सकते हैं sys.exc_info()exc_info()3 मान लौटाता है: प्रकार, मान, ट्रेसबैक। प्रलेखन पर: https://docs.python.org/3/library/sys.html#sys.exc_info

import sys

try:
    foo = bar
except Exception:
    exc_type, value, traceback = sys.exc_info()
    assert exc_type.__name__ == 'NameError'
    print "Failed with exception [%s]" % exc_type.__name__

1

यदि आप पूरी तरह से योग्य वर्ग नाम चाहते हैं (जैसे sqlalchemy.exc.IntegrityErrorकि केवल के बजाय IntegrityError), तो आप नीचे दिए गए फ़ंक्शन का उपयोग कर सकते हैं, जिसे मैंने एमबी के भयानक उत्तर से दूसरे प्रश्न के लिए लिया था (मैंने अपने स्वाद के अनुरूप कुछ चर नाम दिए थे):

def get_full_class_name(obj):
    module = obj.__class__.__module__
    if module is None or module == str.__class__.__module__:
        return obj.__class__.__name__
    return module + '.' + obj.__class__.__name__

उदाहरण:

try:
    # <do something with sqlalchemy that angers the database>
except sqlalchemy.exc.SQLAlchemyError as e:
    print(get_full_class_name(e))

# sqlalchemy.exc.IntegrityError

0

यहां अन्य उत्तर अन्वेषण उद्देश्यों के लिए बहुत अच्छे हैं, लेकिन यदि प्राथमिक लक्ष्य अपवाद को छोड़ना है (अपवाद के नाम सहित), तो शायद प्रिंट के बजाय लॉगिंग.सेक्स का उपयोग करने पर विचार करें ?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.