চেষ্টা-বাদে অন্যটি থাকার কারণ কী?
একটি try
ব্লক আপনাকে প্রত্যাশিত ত্রুটিটি পরিচালনা করতে দেয়। except
ব্লক শুধুমাত্র ব্যতিক্রম আপনি পরিচালনা করতে প্রস্তুত করা হয় ধরা উচিত নয়। যদি আপনি কোনও অপ্রত্যাশিত ত্রুটি পরিচালনা করেন তবে আপনার কোডটি ভুল কাজটি করতে পারে এবং বাগগুলি লুকিয়ে রাখতে পারে।
else
কোনও ত্রুটি না থাকলে একটি ধারা কার্যকর করা হবে এবং try
ব্লকটিতে সেই কোডটি কার্যকর না করে আপনি একটি অপ্রত্যাশিত ত্রুটি ধরা এড়াবেন। আবার, একটি অপ্রত্যাশিত ত্রুটি ধরা বাগগুলি আড়াল করতে পারে।
উদাহরণ
উদাহরণ স্বরূপ:
try:
try_this(whatever)
except SomeException as the_exception:
handle(the_exception)
else:
return something
"চেষ্টা করুন," বাদে স্যুটটিতে দুটি alচ্ছিক ধারা রয়েছে else
এবং finally
। সুতরাং এটি আসলে try-except-else-finally
।
else
যদি কোনও ব্যতিক্রম না থাকে তবেই মূল্যায়ন করবে try
ব্লক । এটি আমাদের নীচে আরও জটিল কোডটি সহজ করার অনুমতি দেয়:
no_error = None
try:
try_this(whatever)
no_error = True
except SomeException as the_exception:
handle(the_exception)
if no_error:
return something
সুতরাং আমরা যদি একটি তুলনা else
বিকল্পটির (যা বাগগুলি তৈরি করতে পারে) তবে আমরা দেখতে পাচ্ছি এটি কোডের লাইনকে হ্রাস করে এবং আমাদের আরও বেশি পঠনযোগ্য, রক্ষণাবেক্ষণযোগ্য এবং কম বগি কোড-বেস থাকতে পারে।
finally
finally
রিটার্নের স্টেটমেন্টের সাথে অন্য লাইনটি মূল্যায়ন করা হলেও তা নির্ধারণ করবে।
সিউডো-কোড সহ ভেঙে গেছে
এটি সম্ভবত ক্ষুদ্রতম আকারে এটি ভাঙ্গতে সহায়তা করতে পারে যা মন্তব্যগুলির মাধ্যমে সমস্ত বৈশিষ্ট্য প্রদর্শন করে demonst এই সিনট্যাক্টিক্যালি সঠিক হিসাবে ধরে নিন (তবে নামগুলি সংজ্ঞায়িত না করা পর্যন্ত চালানো যায় না) সিউডো-কোড কোনও ফাংশনে রয়েছে।
উদাহরণ স্বরূপ:
try:
try_this(whatever)
except SomeException as the_exception:
handle_SomeException(the_exception)
# Handle a instance of SomeException or a subclass of it.
except Exception as the_exception:
generic_handle(the_exception)
# Handle any other exception that inherits from Exception
# - doesn't include GeneratorExit, KeyboardInterrupt, SystemExit
# Avoid bare `except:`
else: # there was no exception whatsoever
return something()
# if no exception, the "something()" gets evaluated,
# but the return will not be executed due to the return in the
# finally block below.
finally:
# this block will execute no matter what, even if no exception,
# after "something" is eval'd but before that value is returned
# but even if there is an exception.
# a return here will hijack the return functionality. e.g.:
return True # hijacks the return in the else clause above
এটি সত্য যে আমরা কোডটিতে কোডটি অন্তর্ভুক্ত করতে পারিelse
ব্লকে try
ব্লকে পরিবর্তে, যদি সেখানে কোন ব্যতিক্রম ছিল যেখানে এটি চালানোর, কিন্তু কি যদি যে কোড নিজেই ধরনের সংক্রামক করছি একটি ব্যতিক্রম উত্থাপন? এটিকে try
ব্লকের মধ্যে রেখে দিলে সেই বাগটি লুকিয়ে থাকবে।
আমরা try
আশা করি না এমন ব্যতিক্রমগুলি এড়ানোর জন্য আমরা ব্লকটিতে কোডের লাইনগুলি হ্রাস করতে চাই, এই নীতির অধীনে যে আমাদের কোডটি ব্যর্থ হলে, আমরা এটি জোরে ব্যর্থ হতে চাই। এটি একটি সেরা অনুশীলন ।
এটি আমার বোঝার ব্যতিক্রমগুলি ত্রুটি নয়
পাইথনে, বেশিরভাগ ব্যতিক্রম ত্রুটি।
পাইডোক ব্যবহার করে আমরা ব্যতিক্রম শ্রেণিবিন্যাস দেখতে পারি। উদাহরণস্বরূপ, পাইথন 2 এ:
$ python -m pydoc exceptions
বা পাইথন 3:
$ python -m pydoc builtins
আমাদের হায়ারার্কি দেবে। আমরা দেখতে পাচ্ছি যে বেশিরভাগ ধরণের Exception
ত্রুটি, যদিও পাইথন এগুলির কয়েকটি for
লুপ ( StopIteration
) শেষ করার মতো জিনিসের জন্য ব্যবহার করে । এটি পাইথন 3 এর শ্রেণিবিন্যাস:
BaseException
Exception
ArithmeticError
FloatingPointError
OverflowError
ZeroDivisionError
AssertionError
AttributeError
BufferError
EOFError
ImportError
ModuleNotFoundError
LookupError
IndexError
KeyError
MemoryError
NameError
UnboundLocalError
OSError
BlockingIOError
ChildProcessError
ConnectionError
BrokenPipeError
ConnectionAbortedError
ConnectionRefusedError
ConnectionResetError
FileExistsError
FileNotFoundError
InterruptedError
IsADirectoryError
NotADirectoryError
PermissionError
ProcessLookupError
TimeoutError
ReferenceError
RuntimeError
NotImplementedError
RecursionError
StopAsyncIteration
StopIteration
SyntaxError
IndentationError
TabError
SystemError
TypeError
ValueError
UnicodeError
UnicodeDecodeError
UnicodeEncodeError
UnicodeTranslateError
Warning
BytesWarning
DeprecationWarning
FutureWarning
ImportWarning
PendingDeprecationWarning
ResourceWarning
RuntimeWarning
SyntaxWarning
UnicodeWarning
UserWarning
GeneratorExit
KeyboardInterrupt
SystemExit
একজন মন্তব্যকারী জিজ্ঞাসা করলেন:
বলুন যে আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা একটি বাহ্যিক এপিআইকে পিং করে এবং আপনি এপিআই র্যাপারের বাইরে কোনও শ্রেণিতে ব্যতিক্রমটি পরিচালনা করতে চান, আপনি কি ব্যতিক্রমী আইনের ব্যতীত অন্য ধারাটির অধীনে পদ্ধতি থেকে সহজভাবে ফিরে আসবেন?
না, আপনি ব্যতিক্রমটি ফিরিয়ে দেবেন না, স্ট্যাকট্রেস raise
সংরক্ষণের জন্য কেবল খালি দিয়ে পুনরায় এটি করুন ।
try:
try_this(whatever)
except SomeException as the_exception:
handle(the_exception)
raise
অথবা, পাইথন 3 এ, আপনি একটি নতুন ব্যতিক্রম বাড়াতে পারেন এবং ব্যতিক্রম চেইন সহ ব্যাকট্রেস সংরক্ষণ করতে পারেন:
try:
try_this(whatever)
except SomeException as the_exception:
handle(the_exception)
raise DifferentException from the_exception
আমি আমার উত্তর এখানে বিস্তারিত ।