উত্তর:
ব্যবহার str
try:
some_method()
except Exception as e:
s = str(e)
এছাড়াও, বেশিরভাগ ব্যতিক্রম ক্লাসগুলির একটি args
বৈশিষ্ট্য থাকবে। প্রায়শই, args[0]
একটি ত্রুটি বার্তা হবে।
এটি লক্ষ করা উচিত যে pyfunc সুপারিশ হিসাবে অন্তত ব্যতিক্রম শ্রেণি প্রদর্শিত হবে str
যেখানে কোনও ত্রুটি বার্তা না থাকলে কেবল ব্যবহার করে একটি খালি স্ট্রিং ফিরে আসবে repr
। আমার গ্রহণযোগ্যতাটি হ'ল আপনি যদি এটি মুদ্রণ করেন তবে এটি এমন কোনও শেষ ব্যবহারকারীর জন্য যা ক্লাসটি কী তা বিবেচনা করে না এবং কেবল একটি ত্রুটি বার্তা চায়।
এটি সত্যিই নির্ভর করে যে আপনি যে ব্যাতিক্রম করছেন তার উপর এবং এটি কীভাবে ইনস্ট্যান্ট হয় তা নির্ভর করে। আপনার মনে বিশেষ কিছু ছিল?
e.message
কারণ args[0]
সম্ভবত কোনও বার্তা নাও থাকতে পারে।
raise Exception(u'jörn')
। ব্যর্থতা বিশেষত খারাপ, কারণ আপনি কখনই আসল ব্যতিক্রম দেখতে পাবেন না তবে কেবল একটি UnicodeDecodeError
। আপনি যদি ব্যতিক্রমটির এনকোডিংটি জানেন না (এবং বেশিরভাগ সময় আপনি না করেন) তবে আপনার উচিত হয় কাজ করা উচিত repr(e)
বা যদি আপনার সত্যিই প্রয়োজন হয় তবে আপনার ব্যতিক্রম হ্যান্ডলিংয়ে অন্য একটি চেষ্টা করুন-ব্লক ব্যবহার করুন যা ইউনিকোডডেকোডেরিয়ারগুলি ধরবে এবং এতে ফিরে যাবে repr(e)
।
str
(বা এমনকি unicode
বা .format
) বাগ পেয়েছি তা আমি গণনা করতে পারি না । আপনার যদি ত্রুটি বার্তার সামগ্রীর সম্পূর্ণ নিয়ন্ত্রণ না থাকে তবে repr
অপ্রত্যাশিত ইউনিকোড ত্রুটিগুলি এড়াতে সর্বদা ব্যবহার করুন ।
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
repr
দরকারী ধন্যবাদ, এটা অন্য কিছু মনে হয় unicode
, str
, এনকোডিং, ... ইনপুট উপর নির্ভর করে একটি ব্যতিক্রম বাড়াতে পারে। বেশ যখন চেহারায় ব্যতিক্রম রাখার চেষ্টা, কিন্তু repr হয় দরকারী exception-safe
মনে হয়
str()
, কারণ এটিতে ব্যতিক্রমের প্রকৃতি অন্তর্ভুক্ত রয়েছে। সঙ্গে str()
আমি পেয়েছিলাম 'status'
যখন সঙ্গে repr()
আমি পেয়েছিলাম KeyError('status')
এবং আমি মত ছিল "aaaaah, এখন আমি ভুল বুঝতে"।
যদিও আমি বুঝতে পারি এটি একটি পুরানো প্রশ্ন, আমি ব্যতিক্রমগুলির আউটপুট পরিচালনা করতে traceback
মডিউলটি ব্যবহার করার পরামর্শ দিতে চাই ।
traceback.print_exc()
স্ট্যান্ডার্ড ত্রুটি হিসাবে বর্তমান ব্যতিক্রমটি মুদ্রণ করতে ব্যবহার করুন , যেমনটি এটি অপরিবর্তিত থাকলে মুদ্রিত হবে, বা traceback.format_exc()
স্ট্রিংয়ের মতো একই আউটপুট পেতে। আপনি যদি আউটপুট সীমাবদ্ধ করতে চান বা মুদ্রণটিকে কোনও ফাইল-জাতীয় অবজেক্টে পুনর্নির্দেশ করতে চান তবে আপনি সেই ফাংশনগুলির মধ্যে যে কোনও একটিতে বিভিন্ন যুক্তিগুলি পাস করতে পারেন।
আর একটি উপায় এখনও দেওয়া হয়নি:
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")'
অজগর 2 এর জন্য, e.message
ব্যতিক্রম বার্তা পাওয়ার জন্য এটি ব্যবহার করা ভাল, এটি সম্ভব এড়ানো হবে UnicodeDecodeError
। তবে হ্যাঁ e.message
কিছু ধরণের ব্যতিক্রম যেমন খালি থাকবে OSError
, সেই ক্ষেত্রে exc_info=True
ত্রুটিটি মিস না করার জন্য আমরা আমাদের লগিং ফাংশনে একটি যুক্ত করতে পারি ।
পাইথন 3 এর জন্য, আমি মনে করি এটি ব্যবহার করা নিরাপদ str(e)
।
ত্রুটি বার্তাটি পরীক্ষা করতে এবং এর সাথে কিছু করার জন্য (পাইথন 3 সহ) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}