سلام دوستان ...در قسمت قبل آموزش پایتون مفاهیم زیر را یاد دادیم
با ادامه آموزش پایتون همراه ما باشید.
عبارت raise به برنامه نویس این امکان را می دهد تا یک استثنای خاص را مجبور به رخ دادن کند. برای مثال:
>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", 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 "<stdin>", line 2, in <module>
NameError: HiThere
</module></stdin>
برنامه ها ممکن است با ساخت یک کلاس جدید استثنا، خود برای استثناهای خود نام بگذارند
معمولا استثناها باید به طور مستقیم یا غیر مستقیم از کلاس Exception مشتق شوند.
کلاس های استثنا را میتوان به گونه ای تعریف کرد که کارهایی که هر کلاس دیگری انجام می دهد را بتوانند انجام دهند، اما معمولا آنها را ساده می سازند. این کلاس ها اغلب فقط تعدادی ویژگی ارائه می کنند که امکان استخراج اطلاعات درباره خطا توسط اداره کننده خطا (handler) را فراهم می کند.
در زمان ایجاد ماژولی که بتواند چندین خطای متمایز را اعلام کند، معمول است که یک کلاس پایه برای استثناهای تعریف شده توسط آن ماژول ایجاد کنند، و نیز زیر کلاسی برای ایجاد کلاس های استثنای خاص برای شرایط متفاوت خطا بسازند.
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised 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
"""
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 "<stdin>", line 2, in <module>
</module></stdin>
اگر یک بخش finally وجود داشته باشد، این بخش finally به عنوان اخرین وظیفه قبل از تکمیل شدن عبارت try اجرا خواهد شد. بخش finally ، چه عبارت try، استثنایی تولید کند یا نکند، اجرا می شود. نکات زیر موارد پیچیده تری از زمانی که استثنا رخ می دهد را بیان می کند.
برای مثال:
>>> def bool_return():
... try:
... return True
... finally:
... return False
...
>>> bool_return()
False
یک مثال پیچیده تر:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", 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("myfile.txt"):
print(line, end="")
مشکل این کد این است که، برای مدت زمان نامعلومی پس از اتمام اجرای این بخش، فایل را باز می گذارد. در کدهای ساده این مسئله ای نیست، اما برای برنامه های بزرگتر می تواند یک مشکل باشد. عبارت with این تضمین را می دهد تا اشیایی مانند فایل ها به گونه ای مورد استفاده قرار گیرند که همیشه فورا و به طور صحیحی تمیز شوند.
with open("myfile.txt") as f:
for line in f:
print(line, end="")
پس از اجرای این عبارت، فایل f همیشه بسته می شود، حتی اگر در حین پردازش خطوط با مشکلی مواجه شود. اشیایی (مانند فایل ها) که عملیات تمیزکاری از پیش تعریف شده را ارائه می کنند، آن را در مستندات خود توضیح می دهند.
دوره آموزش پایتون ادامه دارد