আমি যখন একটি ব্যতিক্রম ধরি, আমি কীভাবে টাইপ, ফাইল এবং লাইন নম্বর পাব?


250

এই জাতীয় মুদ্রণ হবে এমন একটি ব্যতিক্রম ধরা:

Traceback (most recent call last):
  File "c:/tmp.py", line 1, in <module>
    4 / 0
ZeroDivisionError: integer division or modulo by zero

আমি এটিকে ফর্ম্যাট করতে চাই:

ZeroDivisonError, tmp.py, 1

5
অন্তর্নির্মিত ট্রেসব্যাক মডিউলটি ব্যবহার করুন ।
নেড ডিলি

এছাড়া কোড, যেখানে ব্যতিক্রম ঘটেছে লাইন প্রিন্ট করতে সহায়ক হতে পারে: দেখুন stackoverflow.com/questions/14519177/...
Apogentus

উত্তর:


380
import sys, os

try:
    raise NotImplementedError("No error")
except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    print(exc_type, fname, exc_tb.tb_lineno)

51
আপনাকে স্থানীয় ভেরিয়েবলগুলিতে স্যাক.এক্সসি_ইনফো () আনপ্যাক করার বিষয়ে সতর্কতা অবলম্বন করা উচিত, যেহেতু আপনি যদি হ্যান্ডলার ব্যতীত কোনও ব্যতিক্রম পেয়ে থাকেন তবে স্থানীয় ভার্সগুলি জিসিড না করে একটি বৃত্তাকার রেফারেন্সে রাখতে পারে। সর্বদা সেরা অনুশীলন হ'ল পরিবর্তে sys.exc_info () এর বাইরে কেবল সর্বদা স্লাইস ব্যবহার করা। অথবা অন্যান্য পোস্টারগুলির পরামর্শ অনুসারে অন্যান্য মডিউল যেমন ট্রেসব্যাক ব্যবহার করুন।
ড্যানিয়েল প্রাইডেন

1
টিবি কি শুধু এক্স_টিবি? এবং os.path.split (ব্লেবলা) [1] হ'ল os.path.basename (বালবাল)
সানকিয়াং

4
@ বাসজ: sys.exc_info () [0] .__ নাম__ সহ আপনি টাইপটির সরল নাম পাবেন।
জোহানেস ওভারম্যান

5
@ ড্যানিয়েলপ্রাইডেন পাইথন ডকসও একই আনপ্যাকিং পদ্ধতি ডকস.পাইথন.আর.
ব্যবহারকারী :

3
@ রবএম: হ্যাঁ, এটি থ্রেড-নিরাপদ। sys.exc_info()পূর্ববর্তী এপিআই-তে থ্রেড-সুরক্ষা সমস্যাগুলি মোকাবেলায় পরিচয় করানো হয়েছিল। এর আউটপুট বর্তমান থ্রেড এবং বর্তমান স্ট্যাক ফ্রেম উভয়ের জন্যই নির্দিষ্ট।
ব্যবহারকারী 2357112

123

সবচেয়ে সহজ ফর্ম যা আমার পক্ষে কাজ করেছিল।

import traceback

try:
    print(4/0)
except ZeroDivisionError:
    print(traceback.format_exc())

আউটপুট

Traceback (most recent call last):
  File "/path/to/file.py", line 51, in <module>
    print(4/0)
ZeroDivisionError: division by zero

Process finished with exit code 0


5
এটি সম্পর্কে দৃust়তা কি?
jouell

1
@jouell আরে, আমিও কখনও কখনও অভিনব শব্দ ব্যবহার করতে :) পছন্দ
Rishav

পরিষ্কার এবং কার্যকর। ভাগ করে নেওয়ার জন্য ধন্যবাদ :)
হিমাংশু গৌতম

49

সোর্স (পাই v2.7.3) traceback.format_exception () জন্য এবং কল / সম্পর্কিত ফাংশনগুলি ব্যাপকভাবে সহায়তা করে। বিব্রতকরভাবে, আমি সর্বদা উত্স পড়তে ভুলে যাই । আমি কেবল বৃথা অনুরূপ বিশদ অনুসন্ধান করার পরে এটির জন্য এটি করেছি। একটি সাধারণ প্রশ্ন, "ব্যতিক্রমের জন্য পাইথনের একই আউটপুটটি কীভাবে পুনরায় তৈরি করা যায়, সমস্ত বিবরণ সহ?" এটি যে কাউকে তারা খুঁজছে এর জন্য 90 +% পাবে। হতাশ, আমি এই উদাহরণটি নিয়ে এসেছি। আমি আশা করি এটি অন্যকে সহায়তা করে। (এটি অবশ্যই আমাকে সাহায্য করেছিল! ;-)

import sys, traceback

traceback_template = '''Traceback (most recent call last):
  File "%(filename)s", line %(lineno)s, in %(name)s
%(type)s: %(message)s\n''' # Skipping the "actual line" item

# Also note: we don't walk all the way through the frame stack in this example
# see hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280
# (Imagine if the 1/0, below, were replaced by a call to test() which did 1/0.)

try:
    1/0
except:
    # http://docs.python.org/2/library/sys.html#sys.exc_info
    exc_type, exc_value, exc_traceback = sys.exc_info() # most recent (if any) by default

    '''
    Reason this _can_ be bad: If an (unhandled) exception happens AFTER this,
    or if we do not delete the labels on (not much) older versions of Py, the
    reference we created can linger.

    traceback.format_exc/print_exc do this very thing, BUT note this creates a
    temp scope within the function.
    '''

    traceback_details = {
                         'filename': exc_traceback.tb_frame.f_code.co_filename,
                         'lineno'  : exc_traceback.tb_lineno,
                         'name'    : exc_traceback.tb_frame.f_code.co_name,
                         'type'    : exc_type.__name__,
                         'message' : exc_value.message, # or see traceback._some_str()
                        }

    del(exc_type, exc_value, exc_traceback) # So we don't leave our local labels/objects dangling
    # This still isn't "completely safe", though!
    # "Best (recommended) practice: replace all exc_type, exc_value, exc_traceback
    # with sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]

    print
    print traceback.format_exc()
    print
    print traceback_template % traceback_details
    print

এই প্রশ্নের সুনির্দিষ্ট উত্তরে:

sys.exc_info()[0].__name__, os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), sys.exc_info()[2].tb_lineno

1
পরিবর্তন 'message' : exc_value.messageকরার জন্য 'message' : str(exc_value)জন্য py3
user2682863

34

ব্যতিক্রম যেখানে ঘটে তার লাইন নম্বরটি দেখানোর উদাহরণ এখানে।

import sys
try:
    print(5/0)
except Exception as e:
    print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)

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