পাইথনে যে ব্যতিক্রম ধরা পড়েছিল তার নাম কীভাবে পাব?


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
@ ডেলানান এই পরিস্থিতি তৈরি হয়েছে যখন আপনি পরীক্ষা করছেন যে কোনও প্রোগ্রাম প্রোগ্রাম হিসাবে ব্যতিক্রম উত্থাপন করছে
gokul_uf

কিছু কোড ডিআরআইয়ের জন্য আমার এর মতো কিছু দরকার ছিল: আমি যে পদ্ধতিতে ফোন করছি তার দ্বারা বেশ কয়েকটি ব্যতিক্রম উত্থাপিত হতে পারে, প্রতিটি তাদের নিজস্ব 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

এখানে অন্যান্য উত্তরগুলি অনুসন্ধানের উদ্দেশ্যে দুর্দান্ত, তবে প্রাথমিক লক্ষ্যটি যদি ব্যতিক্রমটিকে লগ করা হয় (ব্যতিক্রমটির নাম সহ), সম্ভবত মুদ্রণের পরিবর্তে লগিং.এক্সেপশন ব্যবহার করা বিবেচনা করুন ?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.