পাইথনে ব্যতিক্রম কীভাবে মুদ্রণ করবেন?


723
try:
    something here
except:
    print('the whatever error occurred.')

আমি কীভাবে আমার except:ব্লকে ত্রুটি / ব্যতিক্রমটি মুদ্রণ করতে পারি ?


উত্তর:


1061

পাইথন ২.6 এবং তারপরে এবং পাইথন ৩.x এর জন্য:

except Exception as e: print(e)

পাইথন 2.5 এবং এর আগেরটির জন্য, ব্যবহার করুন:

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'- ব্যতিক্রম প্রকারটি বলে না
ডেভ

10
কী-এরফার্সগুলিতে মুদ্রণ (ঙ) কেবল কীটিই বলে মনে হচ্ছে তবে সম্পূর্ণ ব্যতিক্রম বার্তাটি নয় যা সহায়ক থেকে কম।
Veggiet

14
আপনি যদি ব্যতিক্রমটি মুদ্রণ করতে যাচ্ছেন তবে এটি ব্যবহার করা ভাল print(repr(e)); বেস Exception.__str__প্রয়োগটি কেবল ব্যতিক্রম বার্তা দেয়, প্রকার নয়। অথবা, tracebackমডিউলটি ব্যবহার করুন , যার বর্তমান ব্যতিক্রম মুদ্রণের জন্য পদ্ধতি রয়েছে, ফর্ম্যাট করা হয়েছে বা পুরো ট্রেসব্যাক রয়েছে।
মার্টিজন পিটারস

450

tracebackমডিউলের জন্য পদ্ধতি উপলব্ধ বিন্যাস এবং প্রিন্টিং ব্যতিক্রম এবং তাদের tracebacks, এই যেমন ব্যতিক্রম প্রিন্ট হবে ডিফল্ট হ্যান্ডেলার পছন্দ করে:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

আউটপুট:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

3
আমি কীভাবে অন্য কিছু যুক্ত করতে নিজের মুদ্রণ রুটিনটি ব্যবহার করছি সেভাবে দেখার সাথে মুদ্রণ করতে পারি এমন কোনও ধরণের get_error_message কল রয়েছে।
মাইকশেম

10
@ মাইকশেম error_message = traceback.format_exc()
হাইজলিং

3
আপনাকে ধন্যবাদ, এটিই আমি চেয়েছিলাম। পুরো ট্রেস, কেবল ত্রুটির ধরণ এবং বার্তা নয়
কেন বেলো

এই স্নিপড ক্যাপচারযুক্ত ব্যতিক্রম বস্তুটি ব্যবহার করে না। আপনি কি 'প্রাক্তন' ব্যবহারের জন্য কোডটি প্রসারিত করতে পারেন? - যেমনটি except Exception as ex:...
অ্যারোনস্টার্স

@ অ্যারোনস্টিয়াররা এটি ধরা পড়া ব্যতিক্রম ব্যবহার করে; একটি ব্যতিক্রম হ্যান্ডলারটিতে বর্তমান ব্যতিক্রমটি sys.exc_info()ফাংশনের মাধ্যমে উপলব্ধ এবং traceback.print_exc()ফাংশনটি সেখান থেকে এটি পায়। কোনও ব্যতিক্রম পরিচালনা না করার সময় বা আপনি যখন অন্য কোনও ব্যতিক্রমের ভিত্তিতে তথ্য প্রদর্শন করতে চান তখন আপনাকে কেবল কখনও ব্যতিক্রম স্পষ্টভাবে পাস করতে হবে।
মার্টিজন পিটারস

169

ইন পাইথন 2.6 বা তার অধিক একটু ক্লিনার আছে:

except Exception as e: print(e)

পুরানো সংস্করণগুলিতে এটি এখনও বেশ পাঠযোগ্য:

except Exception, e: print e

15
পাইথন 3-তে অবশ্যই "হিসাবে" সহ 1 ম উপায়টি ব্যবহার করা উচিত।
স্যাম ওয়াটকিন্স

52

আপনি যদি ত্রুটিযুক্ত স্ট্রিংগুলি পাস করতে চান তবে এখানে ত্রুটি এবং ব্যতিক্রমগুলির উদাহরণ রয়েছে (পাইথন ২.6)

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

38

(@ জাল্ডুপন্টের উত্তরের মন্তব্য হিসাবে আমি এটি ছেড়ে যাচ্ছি, তবে আমার যথেষ্ট খ্যাতি নেই))

আমি @ jldupont- এর উত্তর অন্যান্য জায়গাগুলিতেও দেখেছি। এফডাব্লুআইডাব্লু, আমি মনে করি এটি গুরুত্বপূর্ণ:

except Exception as e:
    print(e)

ত্রুটি আউটপুটটি sys.stdoutডিফল্টরূপে মুদ্রণ করবে । সাধারণভাবে ত্রুটি পরিচালনার জন্য আরও উপযুক্ত পন্থাটি হ'ল:

except Exception as e:
    print(e, file=sys.stderr)

(মনে রাখবেন import sysএটির কাজ করার জন্য আপনাকে অবশ্যই এটি করতে হবে This) এইভাবে ত্রুটিটি STDERRপরিবর্তে মুদ্রণ করা হবে STDOUTযা সঠিক আউটপুট পার্সিং / পুনঃনির্দেশ / ইত্যাদির অনুমতি দেয়। আমি বুঝতে পারি যে প্রশ্নটি 'ত্রুটি ছাপানোর' বিষয়ে কঠোরভাবে ছিল, তবে এই বিশদটি বাদ দেওয়ার চেয়ে এখানে সর্বোত্তম অনুশীলনটি চিহ্নিত করা গুরুত্বপূর্ণ বলে মনে হয় যা শেষ পর্যন্ত আরও ভাল শিখেনি এমন কারও জন্য মানসম্মত কোডের দিকে পরিচালিত করতে পারে।

আমি tracebackক্যাট প্লাস প্লাসের উত্তরের মতো মডিউলটি ব্যবহার করি নি এবং সম্ভবত এটিই সবচেয়ে ভাল উপায় তবে আমি ভেবেছিলাম আমি এটি এখানে ফেলে দেব।


1
আমি আরও ফ্লাশ = যোগ করার পরামর্শ দিচ্ছি। আমি সিস্টেমেড (এবং সঠিক লগিং ফ্রেমওয়ার্ক ব্যবহার না করে) লক্ষ্য করেছি যে জার্নালে ক্যাপচার করার সময় বাফারিংটি আমার প্রত্যাশা মতো নয়।
ক্যামেরন কের

19

পাইথন 3: logging

বেসিক print()ফাংশনটি ব্যবহার না করে, আরও নমনীয় loggingমডিউলটি ব্যতিক্রম লগ করতে ব্যবহার করা যেতে পারে। loggingমডিউল অফার অনেক অতিরিক্ত কার্যকারিতা, একটি প্রদত্ত লগ ফাইলে যেমন লগিং বার্তা, টাইমস্ট্যাম্প এবং প্রায় যেখানে লগিং ঘটেছে অতিরিক্ত তথ্য সমেত বার্তা লগিং। (আরও তথ্যের জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন out )

একটি ব্যতিক্রম লগ করা মডিউল স্তরের ফাংশন এর logging.exception()মতো করে করা যেতে পারে:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

আউটপুট:

ERROR:root:An exception was thrown!
Traceback (most recent call last):
  File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

মন্তব্য:

  • ফাংশনটি logging.exception()কেবল একটি ব্যতিক্রম হ্যান্ডলার থেকে কল করা উচিত

  • loggingএকটি এড়ানোর জন্য মডিউলটি লগিং হ্যান্ডলারের ভিতরে ব্যবহার করা উচিত নয় RecursionError(ধন্যবাদ @ প্রখরপাণ্ডে)


বিকল্প লগ-স্তর

এই জাতীয় কীওয়ার্ড আর্গুমেন্ট ব্যবহার করে অন্য লগ-স্তরের সাথে ব্যতিক্রম লগ করা সম্ভব exc_info=True:

logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)


4

যদি আপনি যা করতে চান তবে এক লাইনের ত্রুটি উত্থাপন স্টেটমেন্ট স্টেটমেন্ট দিয়ে করা যেতে পারে। এটি আপনাকে স্থিতিশীলভাবে সংশোধনযোগ্য কোড লিখতে এবং ত্রুটিগুলি তাড়াতাড়ি পরীক্ষা করতে সহায়তা করবে।

assert type(A) is type(""), "requires a string"

2

ব্যতিক্রমগুলি ধরার সময় ট্রেসব্যাক থেকে কোন তথ্য প্রদর্শিত / লগ হওয়া উচিত তার একটিতে বেশ নিয়ন্ত্রণ থাকে।

কোড

with open("not_existing_file.txt", 'r') as text:
    pass

নিম্নলিখিত ট্রেসব্যাক উত্পাদন করতে হবে:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

সম্পূর্ণ ট্রেসব্যাক মুদ্রণ / লগ করুন

অন্যরা ইতিমধ্যে উল্লিখিত হিসাবে, আপনি ট্রেসব্যাক মডিউলটি ব্যবহার করে পুরো ট্রেসব্যাকটি ধরতে পারবেন:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

এটি নিম্নলিখিত আউটপুট উত্পাদন করবে:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

লগিং ব্যবহার করে আপনি এটি অর্জন করতে পারেন:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

আউটপুট:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

শুধুমাত্র প্রিন্ট / লগ ত্রুটির নাম / বার্তা

আপনি পুরো ট্রেসব্যাকটিতে আগ্রহী নাও হতে পারেন, তবে কেবলমাত্র ব্যতিক্রম নাম এবং ব্যতিক্রম বার্তার মতো গুরুত্বপূর্ণ তথ্যগুলিতে:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

আউটপুট:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.