আপনি যখন কেবল ব্যতিক্রমটি পরিচালনা না করেই চেষ্টা করতে চান, আপনি পাইথনে এটি কীভাবে করবেন?
নিম্নলিখিতটি কি এটি করার সঠিক উপায়?
try:
shutil.rmtree(path)
except:
pass
আপনি যখন কেবল ব্যতিক্রমটি পরিচালনা না করেই চেষ্টা করতে চান, আপনি পাইথনে এটি কীভাবে করবেন?
নিম্নলিখিতটি কি এটি করার সঠিক উপায়?
try:
shutil.rmtree(path)
except:
pass
উত্তর:
try:
doSomething()
except:
pass
অথবা
try:
doSomething()
except Exception:
pass
পার্থক্য হল যে প্রথম এক এছাড়াও ধরতে হবে KeyboardInterrupt
, SystemExit
এবং যে ভালো জিনিস, যা সরাসরি থেকে উদ্ভূত হয় exceptions.BaseException
, না exceptions.Exception
।
বিশদ জন্য ডকুমেন্টেশন দেখুন:
try: shuti.rmtree(...) except: pass
crudely কোনো ত্রুটি দমন পাবেন (এমনকি যদি আপনি বানান ভুল shutil
একটি ফলে NameError
) - অন্ততপক্ষে না এexcept OSError:
আপনার আগ্রহী ত্রুটিগুলি কেবলমাত্র ধরা এটি সাধারণত সেরা অনুশীলন হিসাবে বিবেচিত হয় shutil.rmtree
it's সম্ভবত এর ক্ষেত্রে OSError
:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
আপনি যদি চুপচাপ সেই ত্রুটিটিকে উপেক্ষা করতে চান তবে আপনি তা করবেন:
try:
shutil.rmtree(path)
except OSError:
pass
কেন? আপনি বলুন (কোনওভাবে) দুর্ঘটনাবশত ফাংশনটিকে স্ট্রিংয়ের পরিবর্তে একটি পূর্ণসংখ্যা পাস করুন, যেমন:
shutil.rmtree(2)
এটি ত্রুটিটি দেবে "টাইপ এয়ারার: ইউনিকোডে জোর করানো: স্ট্রিং বা বাফার দরকার, ইনট পাওয়া গেছে" - আপনি সম্ভবত এটিকে অগ্রাহ্য করতে চান না, যা ডিবাগ করা কঠিন can
আপনি যদি অবশ্যই সমস্ত ত্রুটি উপেক্ষা করতে চান তবে Exception
খালি except:
বিবৃতি না দিয়ে ধরুন । আবার কেন?
একটি ব্যতিক্রম নির্দিষ্ট না করে প্রতিটি ব্যতিক্রম ধরা পড়ে , যেমন SystemExit
ব্যতিক্রমগুলি উদাহরণস্বরূপ sys.exit()
ব্যবহার করে:
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
এটি নীচের সাথে তুলনা করুন, যা সঠিকভাবে উপস্থিত:
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
আপনি যদি আরও ভাল আচরণের কোডটি লিখতে চান তবে OSError
ব্যতিক্রমটি বিভিন্ন ত্রুটি উপস্থাপন করতে পারে তবে উপরের উদাহরণে আমরা কেবল উপেক্ষা করতে চাই Errno 2
তাই আমরা আরও নির্দিষ্ট হতে পারি:
import errno
try:
shutil.rmtree(path)
except OSError as e:
if e.errno != errno.ENOENT:
# ignore "No such file or directory", but re-raise other errors
raise
shutil.rmtree
সর্বোত্তম উদাহরণ নয়, কারণ আপনি কেবল ignore_errors=True
সেই ফাংশনটির জন্য ব্যবহার করবেন ..
আপনি যখন ব্যতিক্রমটি পরিচালনা না করে কেবল একবার চেষ্টা করতে চান, পাইথনে আপনি কীভাবে এটি করেন?
এটি "পরিচালনা করা" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে।
আপনি যদি কোনও পদক্ষেপ না নিয়ে এটিকে ধরার অর্থ যদি করেন তবে আপনার পোস্ট করা কোডটি কার্যকর হবে।
যদি আপনি বোঝাতে চান যে আপনি ব্যতিক্রমটিকে স্ট্যাকের উপরে যাওয়া বন্ধ না করেই কোনও ব্যতিক্রমের বিরুদ্ধে পদক্ষেপ নিতে চান, তবে আপনি এই জাতীয় কিছু চান:
try:
do_something()
except:
handle_exception()
raise #re-raise the exact same exception that was thrown
প্রথমে আমি এই থ্রেড থেকে জ্যাক ওউ কননারের উত্তর উদ্ধৃত করছি । রেফারেন্সড থ্রেডটি বন্ধ হয়ে গেছে তাই আমি এখানে লিখছি:
"পাইথন ৩.৪-এ এটি করার একটি নতুন উপায় রয়েছে:
from contextlib import suppress
with suppress(Exception):
# your code
এখানে যে প্রতিশ্রুতি যুক্ত করা হয়েছে তা এখানে রয়েছে: http://hg.python.org/cpython/rev/406b47c64480
এবং এখানে লেখক, রেমন্ড হেটিংগার এই এবং অন্যান্য পাইথনের হটনেস সম্পর্কে কথা বলছেন: https://youtu.be/OSGv2VnC0go?t=43m23s
এটিতে আমার যোগটি পাইথন ২.7 সমতুল্য:
from contextlib import contextmanager
@contextmanager
def ignored(*exceptions):
try:
yield
except exceptions:
pass
তারপরে আপনি এটি পাইথন ৩.৪-এর মতো ব্যবহার করুন:
with ignored(Exception):
# your code
সম্পূর্ণতার জন্য:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
এছাড়াও মনে রাখবেন যে আপনি ব্যতিক্রমগুলি এটি ক্যাপচার করতে পারেন:
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print("Handling run-time error:", err)
... এবং এইভাবে ব্যতিক্রমটি আবার উত্থাপন করুন:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
... পাইথন টিউটোরিয়াল থেকে উদাহরণ ।
কীভাবে সঠিকভাবে ব্যতিক্রম উপেক্ষা করবেন?
এই কাজ করার বিভিন্ন উপায় আছে।
যাইহোক, উদাহরণস্বরূপ নির্বাচনের একটি সাধারণ সমাধান রয়েছে যা সাধারণ ক্ষেত্রে কভার করে না।
পরিবর্তে
try:
shutil.rmtree(path)
except:
pass
এটা কর:
shutil.rmtree(path, ignore_errors=True)
এটি নির্দিষ্ট যুক্তি shutil.rmtree
। নিম্নলিখিত কাজগুলি করে আপনি এতে সহায়তা দেখতে পারেন এবং আপনি দেখতে পাবেন এটি ত্রুটিগুলির জন্য কার্যকারিতাও মঞ্জুর করতে পারে।
>>> import shutil
>>> help(shutil.rmtree)
যেহেতু এটি কেবল উদাহরণের সংকীর্ণ কেসটিকেই কভার করে, তাই আমি কী কীভাবে এটি পরিচালনা করব সেগুলি আরও প্রদর্শন করব যদি এই কীওয়ার্ড যুক্তি উপস্থিত না থাকে।
যেহেতু উপরেরটি কেবল উদাহরণের সংকীর্ণ ক্ষেত্রে আবরণ করে, আমি কীভাবে কীভাবে এটি পরিচালনা করব সেগুলি আরও প্রদর্শন করব যদি এই কীওয়ার্ড যুক্তি উপস্থিত না থাকে।
আপনি suppress
প্রসঙ্গ পরিচালকটি আমদানি করতে পারেন :
from contextlib import suppress
তবে কেবল সুনির্দিষ্ট ব্যতিক্রমকে দমন করুন:
with suppress(FileNotFoundError):
shutil.rmtree(path)
আপনি নিঃশব্দে এটিকে উপেক্ষা করবেন FileNotFoundError
:
>>> with suppress(FileNotFoundError):
... shutil.rmtree('bajkjbkdlsjfljsf')
...
>>>
ডক্স থেকে :
সম্পূর্ণরূপে ব্যতিক্রমকে দমন করে এমন অন্য কোনও প্রক্রিয়াটির মতো, এই প্রসঙ্গের পরিচালকটি কেবলমাত্র খুব নির্দিষ্ট ত্রুটিগুলি আবরণ করার জন্য ব্যবহার করা উচিত যেখানে প্রোগ্রাম নির্বাহের সাথে নিঃশব্দে চালিয়ে যাওয়া সঠিক জিনিস হিসাবে পরিচিত।
নোট করুন suppress
এবং FileNotFoundError
কেবল পাইথন 3 এ উপলব্ধ।
আপনি যদি নিজের কোডটি পাইথন 2 তে কাজ করতে চান তবে পরবর্তী বিভাগটি দেখুন:
যখন আপনি কেবল ব্যতিক্রম পরিচালনা না করেই চেষ্টা / করতে চান, আপনি পাইথনে এটি কীভাবে করবেন?
নিম্নলিখিতটি কি এটি করার সঠিক উপায়?
try : shutil.rmtree ( path ) except : pass
পাইথন 2 সামঞ্জস্যপূর্ণ কোডের জন্য, pass
কোনও বিবৃতি নেই এমন বিবৃতি দেওয়ার সঠিক উপায়। কিন্তু আপনি যখন একটি খালি না except:
, যে কি করছেন হিসাবে একই except BaseException:
যার মধ্যে GeneratorExit
, KeyboardInterrupt
এবং SystemExit
এবং সাধারণ, আপনি সেগুলো ধরা চাই না।
প্রকৃতপক্ষে, আপনি যতটা পারেন ব্যতিক্রমটির নামকরণের ক্ষেত্রে সুনির্দিষ্ট হওয়া উচিত।
পাইথনের (2) ব্যতিক্রম শ্রেণিবিন্যাসের অংশ এখানে রয়েছে এবং আপনি দেখতে পাচ্ছেন যে আপনি যদি আরও সাধারণ ব্যতিক্রমগুলি ধরেন তবে আপনি যে সমস্যাগুলি প্রত্যাশা করেছিলেন তা আড়াল করতে পারেন:
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
... and so on
আপনি সম্ভবত এখানে একটি ওএসআরর ধরতে চান, এবং কোনও ডিরেক্টরি নেই তবে সম্ভবত আপনি যে ব্যতিক্রমটি পাত্তা দিচ্ছেন না তা হ'ল।
আমরা পেতে পারেন যে থেকে নির্দিষ্ট ত্রুটিপূর্ণ সংখ্যা errno
যদি আমরা যে হবে না গ্রন্থাগার, এবং reraise:
import errno
try:
shutil.rmtree(path)
except OSError as error:
if error.errno == errno.ENOENT: # no such file or directory
pass
else: # we had an OSError we didn't expect, so reraise it
raise
দ্রষ্টব্য, একটি খালি উত্থাপন মূল ব্যতিক্রম উত্থাপন করে, যা সম্ভবত এই ক্ষেত্রে আপনি চান। আরও সংক্ষিপ্তভাবে লিখিত, যেহেতু pass
ব্যতিক্রম হ্যান্ডলিংয়ে আমাদের কোড সহ স্পষ্টভাবে প্রয়োজন হয় না :
try:
shutil.rmtree(path)
except OSError as error:
if error.errno != errno.ENOENT: # no such file or directory
raise
আপনি যখন ব্যতিক্রমটি পরিচালনা না করে কেবল একবার চেষ্টা করতে চান, পাইথনে আপনি কীভাবে এটি করেন?
এটি আপনাকে ব্যতিক্রমটি কী তা মুদ্রণ করতে সহায়তা করবে :( অর্থাত ব্যতিক্রম না পরিচালনা করে ধরতে চেষ্টা করুন এবং ব্যতিক্রমটি মুদ্রণ করুন))
import sys
try:
doSomething()
except:
print "Unexpected error:", sys.exc_info()[0]
try:
doSomething()
except Exception:
pass
else:
stuffDoneIf()
TryClauseSucceeds()
এফওয়াইআইআই অন্য ধারাটি সমস্ত ব্যতিক্রমের পরে যেতে পারে এবং চেষ্টা করা কোডটি যদি ব্যতিক্রম না ঘটায় তবেই তা চালানো যেতে পারে।
else
এই প্রসঙ্গে একটি ভাল ব্যাখ্যা । এবং এটি যুক্ত finally
করতে সর্বদা যে কোনও (বা ব্যতিক্রম নয়) এর পরে চলবে।
আমার একাধিক আদেশে ত্রুটি উপেক্ষা করার দরকার ছিল এবং ফাকিটি কৌশলটি করেছে did
import fuckit
@fuckit
def helper():
print('before')
1/0
print('after1')
1/0
print('after2')
helper()
পাইথনে, আমরা অন্যান্য ভাষার মতোই ব্যতিক্রমগুলি পরিচালনা করি তবে পার্থক্যটি কিছু বাক্য গঠন পার্থক্য, উদাহরণস্বরূপ,
try:
#Your code in which exception can occur
except <here we can put in a particular exception name>:
# We can call that exception here also, like ZeroDivisionError()
# now your code
# We can put in a finally block also
finally:
# Your code...
আমি সাধারণত:
try:
doSomething()
except:
_ = ""
_ = ""
সঙ্গে pass
।
shutil.rmtree(path, ignore_errors=True)
। তবে এটি বেশিরভাগ ফাংশনের জন্য প্রযোজ্য হবে না।