برلیانس
برلیانس
خواندن ۹ دقیقه·۴ سال پیش

آموزش پایتون-آموزش استثناها در Python


سلام دوستان ...در قسمت قبل آموزش پایتون مفاهیم زیر را یاد دادیم

لینک قسمت اول آموزش پایتون

  • آموزش خواندن و نوشتن فایل در زبان برنامه نویسی پایتون
  • آموزش خطاها و استثناها در برنامه نویسی پایتون
  • آموزش مدیریت استثناها در آموزش پایتون


با ادامه آموزش پایتون همراه ما باشید.


آموزش اعلام استثناها در برنامه نویسی پایتون

عبارت raise به برنامه نویس این امکان را می دهد تا یک استثنای خاص را مجبور به رخ دادن کند. برای مثال:

>>> raise NameError('HiThere')
Traceback (most recent call last):
File &quot<stdin>&quot, line 1, in <module>
NameError: HiThere
</module></stdin>

تنها آرگومان raise بیان می کند که استثنا اعلام شود. این یا باید یک نمونه استثنا (exception instance) باشد یا یک کلاس استثنا ( یک کلاس که از Exception مشتق شده باشد). اگر یک کلاس استثنا پاس شود، با فراخوانی سازنده آن بدون هیچ آرگومانی، به طور ضمنی نمونه گیری می شود.

raise ValueError  # shorthand for 'raise ValueError()'

اگر باید تعیین کنید که آیا یک استثنا اعلام شده اما قصد مدیریت آن را ندارید، حالت ساده تری از عبارت raise به شما این امکان را می دهد تا استثنا را دوباره اعلام کنید.

>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File &quot<stdin>&quot, line 2, in <module>
NameError: HiThere
</module></stdin>

آموزش استثناهای تعریف شده توسط کاربر در آموزش پایتون

برنامه ها ممکن است با ساخت یک کلاس جدید استثنا، خود برای استثناهای خود نام بگذارند

معمولا استثناها باید به طور مستقیم یا غیر مستقیم از کلاس Exception مشتق شوند.

کلاس های استثنا را میتوان به گونه ای تعریف کرد که کارهایی که هر کلاس دیگری انجام می دهد را بتوانند انجام دهند، اما معمولا آنها را ساده می سازند. این کلاس ها اغلب فقط تعدادی ویژگی ارائه می کنند که امکان استخراج اطلاعات درباره خطا توسط اداره کننده خطا (handler) را فراهم می کند.

در زمان ایجاد ماژولی که بتواند چندین خطای متمایز را اعلام کند، معمول است که یک کلاس پایه برای استثناهای تعریف شده توسط آن ماژول ایجاد کنند، و نیز زیر کلاسی برای ایجاد کلاس های استثنای خاص برای شرایط متفاوت خطا بسازند.

class Error(Exception):
&quot&quot&quotBase class for exceptions in this module.&quot&quot&quot
pass
class InputError(Error):
&quot&quot&quotException raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
&quot&quot&quot
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
&quot&quot&quotRaised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
&quot&quot&quot
def __init__(self, previous, next, message):
self.previous = previous
self.next = next

اکثر استثناها، مشابه نامگذاری استثناهای استاندارد، با نام هایی که به “Error” ختم می شود تعریف می شوند. بسیاری از ماژول های استاندارد به منظور گزارش خطاهایی که ممکن است در توابعی که خود تعریف کرده اند رخ دهد، استثناهای خود را تعریف می کنند.

آموزش تعریف عملیات تمیزکاری در برنامه نویسی آموزش پایتون

عبارت try یک بخش اختیاری دیگری نیز دارد که وظیفه آن تعریف عملیات تمیزکاری (clean-up actions) است که تحت هر شرایطی باید اجرا شوند. برای مثال:

>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
File &quot<stdin>&quot, line 2, in <module>
</module></stdin>

اگر یک بخش finally وجود داشته باشد، این بخش finally به عنوان اخرین وظیفه قبل از تکمیل شدن عبارت try اجرا خواهد شد. بخش finally ، چه عبارت try، استثنایی تولید کند یا نکند، اجرا می شود. نکات زیر موارد پیچیده تری از زمانی که استثنا رخ می دهد را بیان می کند.

  • اگر استثنایی در حین اجرای بخش try رخ دهد، استثنا ممکن است توسط بخش except اداره شود. اگر استثنا توسط بخش except اداره نشود، استثنا پس از اجرای بخش finally ، دوباره اعلام می شود.
  • یک استثنا می تواند در حین اجرای یک بخش except یا else رخ دهد. مجددا، استثنا پس از اجرای بخش finally ، دوباره اعلام می شود.
  • اگر عبارت try به یک عبارت break ، continue یا return برسد، بخش finally دقیقا قبل از اجرای عبارات break ، continue یا return اجرا می شود.
  • اگر بخش finally شامل عبارت return باشد، مقدار بازگشت داده شده، از عبارت return بخش finally خواهد بود، نه مقداری که عبارت return بخش try باز می گرداند.

برای مثال:

>>> def bool_return():
... try:
... return True
... finally:
... return False
...
>>> bool_return()
False

یک مثال پیچیده تر:

>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print(&quotdivision by zero!&quot)
... else:
... print(&quotresult is&quot, result)
... finally:
... print(&quotexecuting finally clause&quot)
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide(&quot2&quot, &quot1&quot)
executing finally clause
Traceback (most recent call last):
File &quot<stdin>&quot, line 1, in <module>
File &quot<stdin>&quot, line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
</stdin></module></stdin>

همانطور که می بینید، بخش finally در هر شرایطی اجرا شده است. خطای TypeError که به واسطه تقسیم دو رشته بر هم اعلام شده است، توسط بخش except اداره نشده است، بنابراین پس از اجرای بخش finally دوباره اعلام می شود. در برنامه های دنیای واقعی، استفاده از بخش finally برای آزادسازی منابع خارجی (مانند فایل ها یا ارتباطات شبکه) مفید است، صرف نظر از اینکه آیا استفاده از منبع موفقیت آمیز بوده است.

آموزش عملیات تمیزکاری از قبل تعریف شده در برنامه نویسی پایتون

برخی از اشیا عملیات تمیزکاری استانداردی را تعریف می کنند که در زمانی که شی، دیگر مورد نیاز نیست انجام شوند، صرف نظر از اینکه عملیاتی که از آن شی استفاده می کرد موفق بود یا شکست خورد. مثال زیر را ببینید، که می خواهد یک فایل را باز کند و محتویات آن را روی صفحه نمایش چاپ کند.

for line in open(&quotmyfile.txt&quot):
print(line, end=&quot&quot)

مشکل این کد این است که، برای مدت زمان نامعلومی پس از اتمام اجرای این بخش، فایل را باز می گذارد. در کدهای ساده این مسئله ای نیست، اما برای برنامه های بزرگتر می تواند یک مشکل باشد. عبارت with این تضمین را می دهد تا اشیایی مانند فایل ها به گونه ای مورد استفاده قرار گیرند که همیشه فورا و به طور صحیحی تمیز شوند.

with open(&quotmyfile.txt&quot) as f:
for line in f:
print(line, end=&quot&quot)

پس از اجرای این عبارت، فایل f همیشه بسته می شود، حتی اگر در حین پردازش خطوط با مشکلی مواجه شود. اشیایی (مانند فایل ها) که عملیات تمیزکاری از پیش تعریف شده را ارائه می کنند، آن را در مستندات خود توضیح می دهند.

دوره آموزش پایتون ادامه دارد


آموزش پایتوندوره آموزش پایتونآموزش pythonآموزش پایتون رایگان
شاید از این پست‌ها خوشتان بیاید