পাইথনে ই ব্যতিক্রম ছাড়া আর পার্থক্য


140

নিম্নলিখিত কোডের উভয় স্নিপেট একই কাজ করে। তারা প্রতিটি ব্যতিক্রম ধরা এবং except:ব্লক কোড চালায়

স্নিপেট 1 -

try:
    #some code that may throw an exception
except:
    #exception handling code

স্নিপেট 2 -

try:
    #some code that may throw an exception
except Exception as e:
    #exception handling code

উভয় কনস্ট্রাক্ট মধ্যে ঠিক পার্থক্য কি?


7
@ user2725093 এটি একই প্রশ্ন নয়। আপনি লিঙ্ক জিজ্ঞেস মধ্যে পার্থক্য কি except Exception, e:এবং except Exception as e:। এই প্রশ্নের জিজ্ঞেস কি পার্থক্য মধ্যে except:এবং except Exception as e:
ডেনিস

উত্তর:


155

দ্বিতীয়টিতে আপনি ব্যতিক্রম অবজেক্টের বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন:

>>> def catch():
...     try:
...         asd()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)

কিন্তু এটা ধরা না BaseExceptionবা সিস্টেম-থেকে প্রস্থান ব্যতিক্রম SystemExit, KeyboardInterruptএবং GeneratorExit:

>>> def catch():
...     try:
...         raise BaseException()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch
BaseException

যা খালি ব্যতীত:

>>> def catch():
...     try:
...         raise BaseException()
...     except:
...         pass
... 
>>> catch()
>>> 

দেখুন বিল্ট-ইন ব্যতিক্রমসমূহ দস্তাবেজ এবং বিভাগে ত্রুটি এবং ব্যতিক্রমগুলি আরও তথ্যের জন্য টিউটোরিয়ালের অধ্যায়।


21
ঠিক আছে, এখানে কোন যাদু নেই। Exceptionথেকে প্রাপ্ত BaseException, তাই কেন except Exceptionধরা হয় না BaseException। আপনি লিখলে except BaseExceptionতাও ধরা পড়বে। নগ্ন exceptশুধু সবকিছু ক্যাচ।
ফিজারী

2
আমার উল্লেখ করা উচিত যে একটি খালি exceptঅবশ্যই একের পর এক exceptব্লকের মধ্যে থাকতে হবে , আপনি except Exceptionঅন্য exceptব্লকের সামনে রাখলে আপনি কোনও ত্রুটি পাবেন না : তারা কেবল চুপচাপ উপেক্ষা করা হবে (যদি তারা Exceptionসাবক্লাসগুলি পরিচালনা করে )। কিছু দেখার জন্য।
ভেনেসা ফিপস

@ ম্যাথেজফিপস এই জাতীয় বিন্দু, তাই না? কেস স্টেটমেন্ট বা যদি-অন্য ব্লকগুলির মতো মৃত্যুদণ্ড কার্যকর হয় তবে প্রথম
বেসিক

1
@ বেসিক খালি exceptএবং এর মধ্যে আরও একটি পার্থক্য নির্দেশ করছে except Exception। "কিছু দেখার জন্য" এখন কিছুটা অদ্ভুত দেখাচ্ছে তবে সেই সময় আমি পাইথনটি সুনির্দিষ্ট exceptব্লকটি বেছে নেওয়ার প্রত্যাশা করছিলাম, সে যেখানেই থাকুক না কেন, অন্যথায় এটি খুঁজে পেতে একটু হতাশ হয়েছিলাম ।
ভেনেসা ফিপস

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

51
except:

সমস্ত ব্যতিক্রম গ্রহণ করে , যদিও

except Exception as e:

কেবলমাত্র ব্যতিক্রমগুলি গ্রহণ করে যা আপনি ধরতে চেয়েছিলেন

এখানে একটি উদাহরণ যা আপনি ধরতে চাইছেন তা নয়:

>>> try:
...     input()
... except:
...     pass
... 
>>> try:
...     input()
... except Exception as e:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

প্রথম চুপ করে গেল KeyboardInterrupt!

এখানে একটি দ্রুত তালিকা:

issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False


issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False


issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False

আপনি যদি এগুলির যে কোনওটিকে ধরতে চান তবে এটি করা ভাল

except BaseException:

আপনি কি করছেন তা আপনি জানেন তা উল্লেখ করার জন্য।


সমস্ত ব্যতিক্রমগুলি থেকে শুরু হয়েছে BaseExceptionএবং আপনি যা বোঝাতে চেয়েছিলেন তারা দিন-দিন ( প্রোগ্রামারটির জন্য নিক্ষিপ্ত হবে ) তাদের কাছ থেকেও উত্তরাধিকার সূত্রে প্রাপ্ত Exception


except(Exception)KeyboardInterruptত্রুটি কখনই ধরা দেয় না as eএর সাথে কিছু করার নেই।
পান্ডিতা

2
আমি কখনও বলিনি যে এটি হয়েছে। আমি একবারও উল্লেখ as eকরিনি, কারণ আমি ধরে নিয়েছি এটি সুস্পষ্টভাবে কী করে।
Veedrac

2
এমন কি এমন কোনও ঘটনা রয়েছে যেখানে কোনও ব্যক্তি বেসেক্সেপশন ধরবে এবং তারা কী করছে তা জানবে?
দাভোস

2
@ ডেভোস হ্যাঁ, ক্ষণস্থায়ী লগিং করার সময় আপনি এটি পছন্দ করতে পারেন বা আপনি যদি কোনও ব্যবহারকারীকে কনসোল সরবরাহ করছেন যা আপনি পছন্দ করেন না SystemExitবা KeyboardInterruptএড়ানোর জন্য চান না । সাধারণ ঘটনা নয়, তবে তা ঘটে does
Veedrac

14

কিছু ব্যতিক্রমের সাথে পার্থক্য রয়েছে, উদাহরণস্বরূপ কীবোর্ড ইন্টারটারপেট।

পিইপি 8 পড়া :

একটি খালি ব্যতীত: ধারাটি সিস্টেমএক্সিট এবং কীবোর্ড আন্তঃব্যক্ত ব্যতিক্রমগুলি ধরবে, নিয়ন্ত্রণ-সি এর সাথে কোনও প্রোগ্রামকে বাধা দেওয়া আরও শক্ত করে তোলে এবং অন্যান্য সমস্যার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি সমস্ত ব্যতিক্রমগুলি সিগন্যাল প্রোগ্রামের ত্রুটিগুলি ধরতে চান তবে ব্যতিক্রম ব্যতীত ব্যবহার করুন: (বেয়ার ব্যাক ব্যাকএক্সেপশন ব্যতীত সমান নয় :)।


3

দ্বিতীয় ফর্ম ব্যবহার করে আপনি একটি পরিবর্তনশীল (উপর ভিত্তি করে নামে দেয় asআপনার উদাহরণে, দফা eমধ্যে) exceptতা করতে বাধ্য যাতে আপনি ব্যতিক্রম (টাইপ, বার্তা, স্ট্যাক ট্রেস, ইত্যাদি) মধ্যে infomration ব্যবহার করতে পারেন ব্যতিক্রম বস্তুর সঙ্গে ব্লক সুযোগ ব্যতিক্রমটিকে আরও বিশেষভাবে উপযুক্ত ম্যানোরটিতে পরিচালনা করুন।


1

এটি দেখার আরও একটি উপায়। ব্যতিক্রম বিশদটি পরীক্ষা করে দেখুন:

In [49]: try: 
    ...:     open('file.DNE.txt') 
    ...: except Exception as  e: 
    ...:     print(dir(e)) 
    ...:                                                                                                                                    
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

'হিসাবে হিসাবে ই' সিনট্যাক্স ব্যবহার করে অ্যাক্সেস করার জন্য প্রচুর "জিনিস" রয়েছে।

এই কোডটি কেবলমাত্র এই উদাহরণটির বিশদ প্রদর্শন করার জন্যই বোঝানো হয়েছিল।

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