পাইথনে ব্যতিক্রম মান পাওয়া


239

আমার যদি সেই কোডটি থাকে:

try:
    some_method()
except Exception, e:

আমি কীভাবে এই ব্যতিক্রম মান (স্ট্রিং উপস্থাপনা বলতে চাই) পেতে পারি?

উত্তর:


323

ব্যবহার str

try:
    some_method()
except Exception as e:
    s = str(e)

এছাড়াও, বেশিরভাগ ব্যতিক্রম ক্লাসগুলির একটি argsবৈশিষ্ট্য থাকবে। প্রায়শই, args[0]একটি ত্রুটি বার্তা হবে।

এটি লক্ষ করা উচিত যে pyfunc সুপারিশ হিসাবে অন্তত ব্যতিক্রম শ্রেণি প্রদর্শিত হবে strযেখানে কোনও ত্রুটি বার্তা না থাকলে কেবল ব্যবহার করে একটি খালি স্ট্রিং ফিরে আসবে repr। আমার গ্রহণযোগ্যতাটি হ'ল আপনি যদি এটি মুদ্রণ করেন তবে এটি এমন কোনও শেষ ব্যবহারকারীর জন্য যা ক্লাসটি কী তা বিবেচনা করে না এবং কেবল একটি ত্রুটি বার্তা চায়।

এটি সত্যিই নির্ভর করে যে আপনি যে ব্যাতিক্রম করছেন তার উপর এবং এটি কীভাবে ইনস্ট্যান্ট হয় তা নির্ভর করে। আপনার মনে বিশেষ কিছু ছিল?


আমি একটি প্রতিবেদন তৈরি করার জন্য এটি মুদ্রণ করছি, স্ট্র (ঙ) ঠিক আছে বলে আমার ধারণা। অনেক অনেক ধন্যবাদ
Frias

8
আমি ব্যবহার করতে পছন্দ করব e.messageকারণ args[0]সম্ভবত কোনও বার্তা নাও থাকতে পারে।
cedbeu

3
আপনি সম্পূর্ণ ব্যতিক্রম পেতে চাইলে repr (e) এছাড়াও সহায়ক (উদাঃ নেমেরার ("গ্লোবাল নাম 'ভেরিয়েবল" সংজ্ঞায়িত নয় ",")), "গ্লোবাল নাম' ভেরিয়েবল" সংজ্ঞায়িত নয় "
বেন মরিস

49
এই উত্তরটি, বিপজ্জনক হিসাবে এটা ভালো ইউনিকোড ব্যতিক্রম জন্য ব্যর্থ হবে: raise Exception(u'jörn')। ব্যর্থতা বিশেষত খারাপ, কারণ আপনি কখনই আসল ব্যতিক্রম দেখতে পাবেন না তবে কেবল একটি UnicodeDecodeError। আপনি যদি ব্যতিক্রমটির এনকোডিংটি জানেন না (এবং বেশিরভাগ সময় আপনি না করেন) তবে আপনার উচিত হয় কাজ করা উচিত repr(e)বা যদি আপনার সত্যিই প্রয়োজন হয় তবে আপনার ব্যতিক্রম হ্যান্ডলিংয়ে অন্য একটি চেষ্টা করুন-ব্লক ব্যবহার করুন যা ইউনিকোডডেকোডেরিয়ারগুলি ধরবে এবং এতে ফিরে যাবে repr(e)
জার্ন হিজ

11
@ জার্নহিজের সাথে সম্মত হন। ইউনিকোড হ্যান্ডলিংয়ের কারণে আমি যে পরিমাণ বার str(বা এমনকি unicodeবা .format) বাগ পেয়েছি তা আমি গণনা করতে পারি না । আপনার যদি ত্রুটি বার্তার সামগ্রীর সম্পূর্ণ নিয়ন্ত্রণ না থাকে তবে reprঅপ্রত্যাশিত ইউনিকোড ত্রুটিগুলি এড়াতে সর্বদা ব্যবহার করুন ।
কেনি ট্রিটেক

186

Repr () ব্যবহার করুন এবং repr এবং str ব্যবহারের মধ্যে পার্থক্য রয়েছে

ব্যবহার repr:

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")

ব্যবহার str:

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined

2
অই, reprদরকারী ধন্যবাদ, এটা অন্য কিছু মনে হয় unicode, str, এনকোডিং, ... ইনপুট উপর নির্ভর করে একটি ব্যতিক্রম বাড়াতে পারে। বেশ যখন চেহারায় ব্যতিক্রম রাখার চেষ্টা, কিন্তু repr হয় দরকারী exception-safeমনে হয়
dashesy

2
এটি যে কোনও সমতুল্য সমাধানগুলির চেয়ে অনেক ভাল str(), কারণ এটিতে ব্যতিক্রমের প্রকৃতি অন্তর্ভুক্ত রয়েছে। সঙ্গে str()আমি পেয়েছিলাম 'status'যখন সঙ্গে repr()আমি পেয়েছিলাম KeyError('status')এবং আমি মত ছিল "aaaaah, এখন আমি ভুল বুঝতে"।
jlh

27

যদিও আমি বুঝতে পারি এটি একটি পুরানো প্রশ্ন, আমি ব্যতিক্রমগুলির আউটপুট পরিচালনা করতে tracebackমডিউলটি ব্যবহার করার পরামর্শ দিতে চাই ।

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


23

আর একটি উপায় এখনও দেওয়া হয়নি:

try:
    1/0
except Exception, e:
    print e.message

আউটপুট:

integer division or modulo by zero

args[0] আসলে একটি বার্তা নাও হতে পারে।

str(e)আশেপাশের উক্তি এবং সম্ভবত uইউনিকোডের সাথে শীর্ষস্থানীয় দিয়ে স্ট্রিংটি ফিরে আসতে পারে :

'integer division or modulo by zero'

repr(e) সম্পূর্ণ ব্যতিক্রম উপস্থাপনা দেয় যা সম্ভবত আপনি যা চান তা নয়:

"ZeroDivisionError('integer division or modulo by zero',)"

সম্পাদন করা

আমার খারাপ !!! দেখে মনে হচ্ছে BaseException.message এটি থেকে অবহেলা করা হয়েছে2.6 , শেষ পর্যন্ত, অবশ্যই স্পষ্টভাবে মনে হয় যে ব্যতিক্রম বার্তাগুলি প্রদর্শনের কোনও মানক উপায় এখনও নেই। সুতরাং আমি অনুমান করি যে আপনার প্রয়োজনগুলির সাথে মোকাবিলা করা e.argsএবং তার str(e)উপর নির্ভর করে (এবং সম্ভবত e.messageআপনি যে লিব ব্যবহার করছেন তা সেই প্রক্রিয়াটির উপর নির্ভর করে যদি) তবে সবচেয়ে ভাল।

উদাহরণস্বরূপ, এর সাথে pygraphviz, e.messageব্যতিক্রমটি সঠিকভাবে প্রদর্শন করার একমাত্র উপায়, এর সাহায্যে str(e)বার্তাটি ঘিরে থাকবে u''

তবে এর সাথে MySQLdb, বার্তাটি পুনরুদ্ধার করার সঠিক উপায় হ'ল e.args[1]: e.messageখালি, এবং প্রদর্শিত str(e)হবে'(ERR_CODE, "ERR_MSG")'


0

অজগর 2 এর জন্য, e.messageব্যতিক্রম বার্তা পাওয়ার জন্য এটি ব্যবহার করা ভাল, এটি সম্ভব এড়ানো হবে UnicodeDecodeError। তবে হ্যাঁ e.messageকিছু ধরণের ব্যতিক্রম যেমন খালি থাকবে OSError, সেই ক্ষেত্রে exc_info=Trueত্রুটিটি মিস না করার জন্য আমরা আমাদের লগিং ফাংশনে একটি যুক্ত করতে পারি ।
পাইথন 3 এর জন্য, আমি মনে করি এটি ব্যবহার করা নিরাপদ str(e)


0

আপনি যদি ত্রুটির ধরণ / প্রকারটি না জানেন তবে আপনি চেষ্টা করতে পারেন:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

তবে সচেতন থাকুন, আপনি পেপ 8 সতর্কতা পাবেন:

[W] PEP 8 (E722): do not use bare except

0

ত্রুটি বার্তাটি পরীক্ষা করতে এবং এর সাথে কিছু করার জন্য (পাইথন 3 সহ) ...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.