প্রোগ্রামটি না থামিয়ে পুরো ট্রেসব্যাক কীভাবে প্রিন্ট করবেন?


777

আমি একটি প্রোগ্রাম লিখছি যা 10 টি ওয়েবসাইটকে বিশ্লেষণ করে, ডেটা ফাইলগুলি সনাক্ত করে, ফাইলগুলি সংরক্ষণ করে এবং তারপরে পার্স করে ডেটা তৈরি করতে যা সহজেই NumPy লাইব্রেরিতে ব্যবহার করা যেতে পারে। আছে টন খারাপ লিঙ্ক, দুর্বল গঠিত এক্সএমএল নিখোঁজ এন্ট্রি, এবং অন্যান্য জিনিস আমি এখনও শ্রেণিবদ্ধ করার করেছি মাধ্যমে এই ফাইলটি এনকাউন্টার ত্রুটি। আমি প্রথমে এই জাতীয় ত্রুটিগুলি পরিচালনা করতে এই প্রোগ্রামটি তৈরি করেছি:

try:
    do_stuff()
except:
    pass

তবে এখন আমি ত্রুটিগুলি লগ করতে চাই:

try:
    do_stuff()
except Exception, err:
    print Exception, err

নোট করুন এটি পরবর্তী পর্যালোচনার জন্য লগ ফাইলে মুদ্রণ করছে। এটি সাধারণত খুব অকেজো ডেটা প্রিন্ট করে। আমি যা চাই তা হ'ল মুদ্রিত ঠিক একই রেখাগুলি মুদ্রণ করা যখন ব্যর্থতা ব্যতীত চেষ্টা ব্যতীত ত্রুটিটি ট্রিগার হয়ে যায় তবে আমি এটি চাই না যে এটি আমার প্রোগ্রামটি থামিয়ে দেয় যেহেতু আমি যে লুপগুলি পছন্দ করতে চাই তার ধারাবাহিকতায় বাসা বাঁধে is সমাপ্তি দেখুন।

উত্তর:


579

অন্য কিছু উত্তর ইতিমধ্যে ট্রেসব্যাক মডিউলটি নির্দেশ করেছে ।

দয়া করে লক্ষ্য করুন যে print_excকোনও কোনও কোণে, আপনি যা প্রত্যাশা করবেন তা পাবেন না। পাইথন ২.x এ:

import traceback

try:
    raise TypeError("Oups!")
except Exception, err:
    try:
        raise TypeError("Again !?!")
    except:
        pass

    traceback.print_exc()

... সর্বশেষ ব্যতিক্রমটির ট্রেসব্যাক প্রদর্শন করবে :

Traceback (most recent call last):
  File "e.py", line 7, in <module>
    raise TypeError("Again !?!")
TypeError: Again !?!

যদি আপনার সত্যিকারের আসল ট্রেসব্যাক অ্যাক্সেস করতে হয় তবে একটি সমাধান হ'ল স্থানীয় ভেরিয়েবল থেকে ফিরে আসা ব্যতিক্রম ইনফোগুলি ক্যাশে করা exc_infoএবং এটি ব্যবহার করে প্রদর্শিত print_exception:

import traceback
import sys

try:
    raise TypeError("Oups!")
except Exception, err:
    try:
        exc_info = sys.exc_info()

        # do you usefull stuff here
        # (potentially raising an exception)
        try:
            raise TypeError("Again !?!")
        except:
            pass
        # end of useful stuff


    finally:
        # Display the *original* exception
        traceback.print_exception(*exc_info)
        del exc_info

উত্পাদন:

Traceback (most recent call last):
  File "t.py", line 6, in <module>
    raise TypeError("Oups!")
TypeError: Oups!

যদিও এর সাথে কিছু কমতি রয়েছে:

  • এর দস্তাবেজ থেকে sys_info:

    কোনও ব্যতিক্রম পরিচালনা করছে এমন কোনও ফাংশনে স্থানীয় ভেরিয়েবলকে ট্রেসব্যাক রিটার্ন মান নির্ধারণের ফলে একটি বিজ্ঞপ্তি রেফারেন্স ঘটবে । এটি একই ফাংশনে স্থানীয় ভেরিয়েবল দ্বারা উল্লেখ করা কিছু বা ট্র্যাসব্যাকের দ্বারা আবর্জনা সংগ্রহ হতে আটকাবে। [...] আপনার যদি ট্রেসব্যাকের প্রয়োজন হয় তবে এটি ব্যবহারের পরে মুছে ফেলার বিষয়টি নিশ্চিত করুন (চেষ্টা করে শেষ করুন ... শেষ অবধি)

  • তবে, একই ডক থেকে:

    পাইথন ২.২ দিয়ে শুরু করে, আবর্জনা সংগ্রহ সক্ষম করার পরে এই জাতীয় চক্রগুলি স্বয়ংক্রিয়ভাবে পুনরুদ্ধার হয় এবং সেগুলি অ্যাক্সেসযোগ্য হয়, তবে চক্র তৈরি করা এড়াতে এটি আরও কার্যকর remains


অন্যদিকে, আপনাকে ব্যতিক্রমের সাথে যুক্ত ট্রেসব্যাক অ্যাক্সেস করার অনুমতি দিয়ে পাইথন 3 কম আশ্চর্যজনক ফলাফল দেয়:

import traceback

try:
    raise TypeError("Oups!")
except Exception as err:
    try:
        raise TypeError("Again !?!")
    except:
        pass

    traceback.print_tb(err.__traceback__)

... প্রদর্শিত হবে:

  File "e3.py", line 4, in <module>
    raise TypeError("Oups!")

707

traceback.format_exc()বা sys.exc_info()যদি আপনি চান তবে আরও তথ্য উত্পন্ন করবে।

import traceback
import sys

try:
    do_stuff()
except Exception:
    print(traceback.format_exc())
    # or
    print(sys.exc_info()[2])

1
print(sys.exc_info()[0]কপি করে প্রিন্ট <class 'Exception'>
weberc2

2
Dont ব্যবহার exc ... ট্রেসব্যাক সব রয়েছে তথ্য stackoverflow.com/questions/4564559/...
qrtLs

258

আপনি যদি ডিবাগ করছেন এবং কেবল বর্তমান স্ট্যাক ট্রেস দেখতে চান তবে আপনি কেবল কল করতে পারেন:

traceback.print_stack()

এটিকে আবার ধরার জন্য ম্যানুয়ালি কোনও ব্যতিক্রম বাড়াতে হবে না।


9
ট্রেসব্যাক মডিউল হুবহু এটি করে - একটি ব্যতিক্রম বাড়াতে এবং ধরা।
পিপ্পারি

3
ডিফল্ট বিটিডব্লিউ দ্বারা আউটপুট STDERR এ যায়। আমার লগগুলিতে উপস্থিত হচ্ছিল না কারণ এটি অন্য কোথাও পুনঃনির্দেশিত হয়েছিল।
এমপেন

101

প্রোগ্রামটি না থামিয়ে পুরো ট্রেসব্যাক কীভাবে প্রিন্ট করবেন?

আপনি যখন কোনও ত্রুটির কারণে আপনার প্রোগ্রামটি থামাতে চান না, আপনি চেষ্টা করে / বাদ দিয়ে ত্রুটিটি পরিচালনা করতে হবে:

try:
    do_something_that_might_error()
except Exception as error:
    handle_the_error(error)

পূর্ণ ট্রেসব্যাকটি বের করতে, আমরা tracebackস্ট্যান্ডার্ড লাইব্রেরি থেকে মডিউলটি ব্যবহার করব :

import traceback

এবং পুরো স্ট্যাকট্রেস আমরা পেয়েছি তা দেখানোর জন্য একটি শালীন জটিল স্ট্যাকট্রেস তৈরি করতে:

def raise_error():
    raise RuntimeError('something bad happened!')

def do_something_that_might_error():
    raise_error()

মুদ্রণ

করার প্রিন্ট পূর্ণ ট্রেসব্যাক, ব্যবহার traceback.print_excপদ্ধতি:

try:
    do_something_that_might_error()
except Exception as error:
    traceback.print_exc()

কোন মুদ্রণ:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in do_something_that_might_error
  File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!

প্রিন্টিং, লগিংয়ের চেয়ে ভাল:

তবে, আপনার মডিউলের জন্য একটি লগার স্থাপন করা একটি সেরা অনুশীলন। এটি মডিউলটির নাম জানবে এবং স্তরগুলি পরিবর্তন করতে সক্ষম হবে (অন্যান্য বৈশিষ্ট্যগুলির মধ্যে যেমন হ্যান্ডলারের)

import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

এই ক্ষেত্রে, আপনি logger.exceptionপরিবর্তে ফাংশনটি চাইবেন :

try:
    do_something_that_might_error()
except Exception as error:
    logger.exception(error)

কোন লগ:

ERROR:__main__:something bad happened!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in do_something_that_might_error
  File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!

অথবা সম্ভবত আপনি কেবল স্ট্রিং চান, সেক্ষেত্রে আপনি তার traceback.format_excপরিবর্তে ফাংশনটি চান :

try:
    do_something_that_might_error()
except Exception as error:
    logger.debug(traceback.format_exc())

কোন লগ:

DEBUG:__main__:Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in do_something_that_might_error
  File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!

উপসংহার

এবং তিনটি বিকল্পের জন্য, আমরা দেখতে পাই যে আমাদের ত্রুটি হওয়ার সময় আমরা একই আউটপুট পাই:

>>> do_something_that_might_error()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in do_something_that_might_error
  File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!

2
যেমনটি উপরে এবং আমার জন্যও বলা হয়েছে, traceback.print_exc()কেবলমাত্র শেষ কলটি ফেরত: আপনি কীভাবে স্ট্যাকের কয়েকটি স্তর (এবং সম্ভবত সমস্ত লেভেল গুলি?) ফিরে আসতে সফল হন
হেরভে-গেরিন

আপনি এখানে কী জিজ্ঞাসা করছেন তা আমি নিশ্চিত নই আমি প্রদর্শন করেছি যে আমরা প্রোগ্রাম / দোভাষীর প্রবেশের পয়েন্ট পর্যন্ত ট্র্যাকব্যাক পেয়েছি। আপনি কি পরিষ্কার না?
অ্যারন হল

1
@ জেকোবি যা বলছে তা হ'ল আপনি যদি ধরেন এবং পুনরায় উত্থাপন করেন তবে ট্রেসব্যাক.প্রিন্ট_এক্সসি () কেবল পুনরায় উত্থাপিত স্ট্যাকটি ফিরিয়ে দেবে, মূল স্ট্যাকটি নয়।
fizloki

@ ফিজলকি আপনি কীভাবে "পুনর্নির্মাণ" করছেন? আপনি কি খালি raiseবা ব্যতিক্রম শৃঙ্খলা করছেন , বা আপনি মূল ট্রেসব্যাকটি আড়াল করছেন? দেখতে stackoverflow.com/questions/2052390/...
হারুন হলের

21

প্রথমত, না ব্যবহার printগুলি লগিং জন্য, অস্থির হয়, প্রমাণিত এবং যে কাজ করতে stdlib মডিউল আউট সুচিন্তিত: logging। পরিবর্তে আপনার অবশ্যই এটি ব্যবহার করা উচিত

দ্বিতীয়ত, একটি কাজ করতে প্রলুব্ধ হয়ো না জগাখিচুড়ি যখন সেখানে নেটিভ এবং সহজ পদ্ধতির সম্পর্কহীন সরঞ্জামগুলির সাথে। এটা এখানে:

log = logging.getLogger(__name__)

try:
    call_code_that_fails()
except MyError:
    log.exception('Any extra info you want to see in your logs')

এটাই. আপনি এখন সম্পন্ন হয়েছে।

হুডের নীচে কীভাবে জিনিসগুলি কাজ করতে আগ্রহী তার জন্য ব্যাখ্যা

কি log.exceptionআসলে করছে শুধু একটি কল log.error(যে, লগ ইন করুন স্তর সঙ্গে ঘটনা ERROR) এবং তারপর ট্রেসব্যাক মুদ্রণ করুন।

কেন এটা ভাল?

ঠিক আছে, এখানে কিছু বিবেচনা দেওয়া হল:

  • এটা ঠিক ঠিক ;
  • এটা সোজা;
  • এটা সহজ.

কারও tracebackসাথে লগারকে কল করা বা কল করা exc_info=Trueবা তাদের হাত নোংরা করা উচিত নয় sys.exc_info?

ঠিক আছে, কারণ! এগুলি সবই বিভিন্ন উদ্দেশ্যে রয়েছে। উদাহরণস্বরূপ, traceback.print_excএর আউটপুটটি ইন্টারপ্রেটার নিজেই উত্পাদিত ট্রেসব্যাক থেকে কিছুটা আলাদা। আপনি যদি এটি ব্যবহার করেন তবে আপনি আপনার লগগুলি পড়েন এমন কাউকে বিভ্রান্ত করবেন, তারা তাদের বিরুদ্ধে মাথা ঠাট্টা করবে।

exc_info=Trueলগ কলগুলিতে পাস করা কেবল অনুচিত। তবে , পুনরুদ্ধারযোগ্য ত্রুটিগুলি ধরার সময় এটি কার্যকর এবং আপনি সেগুলি (উদাহরণস্বরূপ INFOস্তর) ট্র্যাকব্যাকগুলির সাহায্যে লগ করতে চান , কারণ log.exceptionশুধুমাত্র একটি স্তরের লগ তৈরি করে - ERROR

এবং আপনার অবশ্যই যথাসম্ভব sys.exc_infoযতটা সম্ভব গোলমাল করা এড়ানো উচিত । এটি শুধু একটি পাবলিক ইন্টারফেস না, এটি একটি অভ্যন্তরীণ এক - আপনি পারেন এটি ব্যবহার যদি আপনি স্পষ্টভাবে জানেন আপনি কি করছেন। এটি কেবল ব্যতিক্রম মুদ্রণের জন্য নয়।


4
এটি যেমন হয় তেমন কাজ করে না। শেষ ঘন্টা. আমার এখনই করা হয়নি: এই উত্তরটি কেবল সময় নষ্ট করে।
এ। রাগার

আমি যোগ করতে চাই যে আপনি ঠিক করতে পারেন logging.exception()। আপনার বিশেষ প্রয়োজনীয়তা না থাকলে লগের উদাহরণ তৈরি করার দরকার নেই।
শীতল শাহ

9

অ্যারন হলের উত্তর ছাড়াও, যদি আপনি লগইন করেন তবে ব্যবহার করতে চান না logging.exception()(যেহেতু এটি ইআরআর লেভেলে লগ হয়), আপনি নিম্ন স্তর এবং পাস ব্যবহার করতে পারেন exc_info=True। যেমন

try:
    do_something_that_might_error()
except Exception:
    logger.info('General exception noted.', exc_info=True)

7

স্ট্রিং হিসাবে সুনির্দিষ্ট স্ট্যাক ট্রেসটি পেতে , এটি উত্থাপিত হত যদি কোনও পদক্ষেপ নেওয়ার / চেষ্টা না করে কেবল এটিকে উত্থাপন করা হত তবে আপত্তিজনক ব্যতিক্রম ধরা কেবল এই ব্লকের মধ্যে রাখুন।

desired_trace = traceback.format_exc(sys.exc_info())

এটি কীভাবে ব্যবহার করবেন তা এখানে রয়েছে (ধরে নেওয়া flaky_funcহচ্ছে সংজ্ঞায়িত, এবং logআপনার প্রিয় লগিং সিস্টেমকে কল করে):

import traceback
import sys

try:
    flaky_func()
except KeyboardInterrupt:
    raise
except Exception:
    desired_trace = traceback.format_exc(sys.exc_info())
    log(desired_trace)

এটিগুলি ধরা এবং পুনরায় উত্থাপন করা ভাল ধারণা KeyboardInterrupt, যাতে আপনি এখনও Ctrl-C ব্যবহার করে প্রোগ্রামটি মেরে ফেলতে পারেন। লগিং প্রশ্নের ক্ষেত্রের বাইরে, তবে লগিং একটি ভাল বিকল্প । সিস এবং ট্রেসব্যাক মডিউলগুলির জন্য ডকুমেন্টেশন ।


4
এটি পাইথন 3 এ কাজ করে না এবং এটিকে পরিবর্তন করা দরকার desired_trace = traceback.format_exc()। পাসিংsys.exc_info()যুক্তি হিসাবে করা কখনই সঠিক জিনিস ছিল না, তবে পাইথন 2 in তে নীরবে উপেক্ষা করা হবে তবে পাইথন 3-তে নয় (যাইহোক 3.6.4)।
মার্টিনিউ

2
KeyboardInterrupt(প্রত্যক্ষ বা পরোক্ষভাবে) থেকে প্রাপ্ত নয় Exception। (উভয় থেকেই উদ্ভূত BaseException।) এর অর্থ except Exception:কখনই একটিকে ধরে ফেলবে না KeyboardInterruptএবং সুতরাং এটি except KeyboardInterrupt: raiseসম্পূর্ণ অপ্রয়োজনীয়।
এজেউফেল্ড

traceback.format_exc(sys.exc_info())অজগর 3.6.10 নিয়ে আমার জন্য কাজ করছেন না
নাম জি ভিউ

6

ত্রুটি দেখা দিতে পারে এমন সবচেয়ে অন্তর্লুপের ভিতরে যেখানে আপনাকে চেষ্টা করতে হবে, ততক্ষণে

for i in something:
    for j in somethingelse:
        for k in whatever:
            try:
                something_complex(i, j, k)
            except Exception, e:
                print e
        try:
            something_less_complex(i, j)
        except Exception, e:
            print e

... ইত্যাদি

অন্য কথায়, আপনার পক্ষে এমন স্টেটমেন্টগুলি মোড়ানো দরকার যা চেষ্টা করে ব্যর্থ হতে পারে / যতটা সম্ভব সুনির্দিষ্ট ব্যতীত যতটা সম্ভব অভ্যন্তরীণ লুপে।


6

এই উত্তরের মন্তব্য সম্পর্কে একটি মন্তব্য: print(traceback.format_exc())আমার চেয়ে ভাল কাজ করে traceback.print_exc()। পরেরটির সাথে, helloমাঝে মাঝে ট্র্যাসব্যাক পাঠ্যের সাথে অদ্ভুতভাবে "মিশ্রিত" হয়, যেমন উভয়ই একই সময়ে স্টডআউট বা স্ট্ডারকে লিখতে চাইলে অদ্ভুত আউটপুট তৈরি করে (কমপক্ষে কোনও পাঠ্য সম্পাদকের অভ্যন্তর থেকে বিল্ডিংয়ের সময় এবং আউটপুটটি দেখায়) "ফলাফল তৈরি করুন" প্যানেল)।

ট্রেসব্যাক (সবচেয়ে সাম্প্রতিকতম কল সর্বশেষ):
সর্বশেষতম ফাইল "সি: \ ব্যবহারকারী \ ব্যবহারকারী \ ডেস্কটপ \ টেস্ট.পি", নং 7-এ,
নরকে do_stuff ()
ফাইল "সি: \ ব্যবহারকারী \ ব্যবহারকারী \ ডেস্কটপ \ টেস্ট.পি", লাইন 4 , do_stuff
1/0
জিরো ডিভিশনইরির: পূর্ণসংখ্যা বিভাগ বা শূন্য দ্বারা মডুলো

[0.1s সমাপ্ত]

সুতরাং আমি ব্যবহার:

import traceback, sys

def do_stuff():
    1/0

try:
    do_stuff()
except Exception:
    print(traceback.format_exc())
    print('hello')

5

আমি অন্য কোনও উত্তরে এটি উল্লিখিত দেখতে পাচ্ছি না। যদি আপনি কোনও কারণে কোনও ব্যতিক্রমী অবজেক্টের পাশ দিয়ে চলে যান ...

পাইথন ৩.৫+ তে আপনি ট্রেসব্যাক.ট্রেসব্যাকএক্সেপশন.ফ্রম_ এক্সসেপশন () ব্যবহার করে একটি ব্যতিক্রমী অবজেক্ট থেকে ট্রেস পেতে পারেন । উদাহরণ স্বরূপ:

import traceback


def stack_lvl_3():
    raise Exception('a1', 'b2', 'c3')


def stack_lvl_2():
    try:
        stack_lvl_3()
    except Exception as e:
        # raise
        return e


def stack_lvl_1():
    e = stack_lvl_2()
    return e

e = stack_lvl_1()

tb1 = traceback.TracebackException.from_exception(e)
print(''.join(tb1.format()))

তবে উপরোক্ত কোডের ফলাফল:

Traceback (most recent call last):
  File "exc.py", line 10, in stack_lvl_2
    stack_lvl_3()
  File "exc.py", line 5, in stack_lvl_3
    raise Exception('a1', 'b2', 'c3')
Exception: ('a1', 'b2', 'c3')

এটি স্ট্যাকের মাত্র দুটি স্তর, পর্দায় যা ছাপানো হত তার বিপরীতে ব্যতিক্রমটি উত্থাপন করা হয়েছে stack_lvl_2()এবং বাধা না দেওয়া হয়েছে# raise লাইনটিকে ) করা হয়েছিল।

যেহেতু আমি এটি বুঝতে পেরেছি, কারণ ব্যতিক্রমগুলি কেবল স্ট্যাকের বর্তমান স্তরে যখন এটি উত্থাপিত হয় রেকর্ড করে stack_lvl_3()। এটি স্ট্যাকের মধ্য দিয়ে ফিরে যাওয়ার সাথে সাথে আরও স্তরগুলি যুক্ত হচ্ছে __traceback__। তবে আমরা এটিকে বাধা দিয়েছি stack_lvl_2(), যার অর্থ এটি রেকর্ডিংয়ের মতোই ছিল মাত্রা 3 এবং 2 st

import traceback


def stack_lvl_3():
    raise Exception('a1', 'b2', 'c3')


def stack_lvl_2():
    stack_lvl_3()


def stack_lvl_1():
    stack_lvl_2()


try:
    stack_lvl_1()
except Exception as exc:
    tb = traceback.TracebackException.from_exception(exc)

print('Handled at stack lvl 0')
print(''.join(tb.stack.format()))

যার ফলাফল:

Handled at stack lvl 0
  File "exc.py", line 17, in <module>
    stack_lvl_1()
  File "exc.py", line 13, in stack_lvl_1
    stack_lvl_2()
  File "exc.py", line 9, in stack_lvl_2
    stack_lvl_3()
  File "exc.py", line 5, in stack_lvl_3
    raise Exception('a1', 'b2', 'c3')

লক্ষ্য করুন যে স্ট্যাকের মুদ্রণটি আলাদা, প্রথম এবং শেষ লাইনগুলি অনুপস্থিত। কারণ এটি অন্যরকমformat()

সম্ভাব্যভাবে উত্থাপিত পয়েন্টটি থেকে দূরে ব্যতিক্রমকে বিরত রাখা আরও সহজ তথ্য দেওয়ার পাশাপাশি আরও সহজ কোড তৈরি করে।


এটি পূর্বের পদ্ধতি (গুলি) এর চেয়ে অনেক ভাল, তবে এখনও একটি স্ট্যাকট্রেস মুদ্রণের জন্য হাস্যকরভাবে বিশৃঙ্খলাযুক্ত। জাভা কম কোড এফজিএস নেয়।
elhefe

3

আপনি ট্রেসব্যাক মডিউলটি চান এটি আপনাকে পাইথনের মতো স্ট্যাক ডাম্পগুলি মুদ্রণ করতে দেয়। বিশেষত, মুদ্রণ_লাস্ট ফাংশনটি সর্বশেষ ব্যতিক্রম এবং একটি স্ট্যাক ট্রেস মুদ্রণ করবে।


3

এর সাথে ব্যতিক্রমী অবজেক্ট থেকে স্ট্রিং হিসাবে সম্পূর্ণ ট্রেসব্যাক পান traceback.format_exception

যদি আপনার কাছে কেবল ব্যতিক্রম অবজেক্ট থাকে তবে আপনি পাইথন 3 এ কোডের যে কোনও বিন্দু থেকে স্ট্রিং হিসাবে ট্রেসব্যাকটি পেতে পারেন:

import traceback

''.join(traceback.format_exception(None, exc_obj, exc_obj.__traceback__))

সম্পূর্ণ উদাহরণ:

#!/usr/bin/env python3

import traceback

def f():
    g()

def g():
    raise Exception('asdf')

try:
    g()
except Exception as e:
    exc = e

tb_str = ''.join(traceback.format_exception(None, exc_obj, exc_obj.__traceback__))
print(tb_str)

আউটপুট:

Traceback (most recent call last):
  File "./main.py", line 12, in <module>
    g()
  File "./main.py", line 9, in g
    raise Exception('asdf')
Exception: asdf

ডকুমেন্টেশন: https://docs.python.org/3.7/library/traceback.html#traceback.format_exception

আরও দেখুন: একটি ব্যতিক্রম বস্তু থেকে ট্রেসব্যাক তথ্য বের করুন

পাইথন ৩.7.৩ এ পরীক্ষিত।


2

আপনার যদি ইতিমধ্যে কোনও ত্রুটিযুক্ত বস্তু থাকে এবং আপনি পুরো জিনিসটি মুদ্রণ করতে চান তবে আপনাকে এটি কিছুটা বিশ্রী কল করতে হবে:

import traceback
traceback.print_exception(type(err), err, err.__traceback__)

এটা ঠিক, তিনটিprint_exception লাগে অবস্থানগত আর্গুমেন্ট : ব্যতিক্রমের ধরণ, প্রকৃত ব্যতিক্রম বস্তু এবং ব্যতিক্রমটির নিজস্ব অভ্যন্তরীণ ট্রেসব্যাক সম্পত্তি।

অজগর 3.5 বা তারপরে, এটি type(err)বিকল্প ...

traceback.print_exception(None, err, err.__traceback__)

এই সমস্ত কেন ঠিক নেই তা আমার কোনও ধারণা নেই traceback.print_exception(err)। আপনি কেন কখনও কোনও ত্রুটি মুদ্রণ করতে চান, সেই ত্রুটিটির সাথে থাকা অন্যটি ছাড়াও কোনও ট্রেসব্যাক কেন আমার বাইরে beyond

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