آموزش ساخت exception سفارشی در پایتون
در این آموزش با استفاده از چند مثال به شما آموزش خواهیم داد که چطور exceptionهای سفارشی خودتان را ایجاد کنید. پایتون دارای چند exception داخلی است که برنامه را مجبور میکند در زمان وجود مشکل، یک پیغام خطای مناسب نمایش دهد. با این حال، گاهی اوقات ممکن است لازم باشد exception سفارشی خودتان را ایجاد کنید تا برنامه پیغام خطایی که شما میخواهید را نمایش دهد.
دوره پیشنهادی: دوره سوم آموزش پروژه محور پایتون
# ساخت یک استثنا سفارشی
در پایتون، کاربران می توانند با ایجاد یک کلاس جدید، استثناهای سفارشی را تعریف کنند. این کلاس استثنا باید به طور مستقیم یا غیرمستقیم از کلاس Exception داخلی ارثبری کند. بسیاری از استثناهای داخلی نیز از این کلاس ارثبری میکنند.
>>> class CustomError(Exception):
... pass
...
>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
>>> raise CustomError("An error occurred")
Traceback (most recent call last):
...
__main__.CustomError: An error occurred
در اینجا، ما یک استثنا سفارشی به نام CustomError ایجاد کرده ایم که از کلاس Exception ارثبری میکند. این استثنا جدید، مانند سایر استثناها، می تواند با استفاده از دستور raise یک پیغام خطای اختیاری را نمایش دهد.
هنگامی که ما در حال توسعه یک برنامه بزرگ پایتون هستیم، بهتر است که تمام استثناهای سفارشی را که در برنامه ما وجود دارد در یک فایل جداگانه قرار دهیم. بسیاری از ماژول های استاندارد پایتون این کار را انجام می دهند. آنها استثناهای خود را به طور جداگانه در فایلی به نام exceptions.py یا errors.py تعریف می کنند (به طور کلی اما نه همیشه).
کلاس استثنایی که تعریف کردید می تواند هر کاری را که یک کلاس معمولی می تواند انجام دهد را پیاده سازی کند، اما ما به طور کلی آنها را ساده و مختصر طراحی می کنیم. در اکثر موارد یک کلاس پایه برای تمام exceptionهای برنامه ایجاد میکنیم و سایر کلاس های استثنا از این کلاس پایه ارثبری می کنند. این مفهوم در مثال زیر واضح تر شده است.
مقاله پیشنهادی: آموزش self در پایتون
# مثال
در این مثال، ما نشان خواهیم داد که چگونه استثناهای سفارشی را می توان در یک برنامه برای ایجاد و کشف خطاها استفاده کرد.
در این برنامه از کاربر درخواست میکنیم که یک نام کاربری برای خودش انتخاب کند. هر نامی به جز admin مجاز است. اگر کاربر نام admin را انتخاب کند با پیغام خطا مواجه خواهد شد:
class BaseException(Exception):
pass
class UsernameException(BaseException):
pass
username = input('Enter username: ')
if username == 'admin':
raise UsernameException
else:
print('Thank you!!!')
اگر کد بالا را اجرا کنیم به شکل زیر نتیجه میدهد:
>>> Enter username: jack
Thank you!!!
>>> Enter username: admin
Traceback (most recent call last):
File "/home/amir/Desktop/python/four.py", line 10, in <module>
raise UsernameException
__main__.UsernameException
در کد بالا یک یک کلاس استثنا سفارشی به نام BaseException ایجاد کردهایم که پایه تمام استثناها در برنامه ماست. کلاس دیگری به نام UsernameException ایجاد کردیم که از کلاس BaseException ارثبری میکند. این exception فقط زمانی مطرح خواهد شد که کاربر نامی غیر مجاز انتخاب کرده باشد.
مقاله پیشنهادی: عملگر سهگانه(ternary) در پایتون
# تغییر رفتار استثنا
ما میتوانیم کلاس exception را بیشتر سفارشی کنیم تا آرگومانهای دیگر را بر اساس نیاز خود بپذیرد.
برای یادگیری سفارشی سازی کلاس های Exception، باید دانش اولیه برنامه نویسی شی گرا را داشته باشید. برای شروع یادگیری برنامه نویسی شی گرا در پایتون به برنامه نویسی شی گرا پایتون مراجعه کنید.
به مثال زیر دقت کنید:
class BaseException(Exception):
pass
class UsernameException(BaseException):
def __init__(self, message='you cant choose admin as username'):
self.message = message
super().__init__(self.message)
username = input('Enter username: ')
if username == 'admin':
raise UsernameException
else:
print('Thank you!!!')
در کد بالا متد سازنده init را بازنویسی کردیم تا بتوانیم آرگومان های اضافی را بگیریم. آرگومان message پیغامی است که قرار است نمایش دهیم. این آرگومان به متد init کلاس Exception ارسال خواهد شد.
اگر کد بالا را اجرا کنید نتیجه زیر را میدهد:
>>> Enter username: admin
Traceback (most recent call last):
File "/home/amir/Desktop/python/four.py", line 13, in <module>
raise UsernameException
__main__.UsernameException: you cant choose admin as username
همچنین میتوانید در کدتان پیغام دیگری را به استثنا ارسال کنید:
>>> raise UsernameException('this username is not allowed')
>>> Enter username: admin
Traceback (most recent call last):
File "/home/amir/Desktop/python/four.py", line 13, in <module>
raise UsernameException('this username is not allowed')
__main__.UsernameException: this username is not allowed
اگر نیاز به آرگومانهای بیشتری داشتید میتوانید متد __str__ را بازنویسی کنید:
class BaseException(Exception):
pass
class UsernameException(BaseException):
def __init__(self, name, message='you cant choose admin as username'):
self.name = name
self.message = message
super().__init__(self.message)
def __str__(self):
return f'Dear {self.name}, {self.message}'
username = input('Enter username: ')
if username == 'admin':
raise UsernameException('kevin')
else:
print('Thank you!!!')
اگر کد بالا را اجرا کنید نتیجه زیر را میدهد:
>>> Enter username: admin
Traceback (most recent call last):
File "/home/amir/Desktop/python/four.py", line 17, in <module>
raise UsernameException('kevin')
__main__.UsernameException: Dear kevin, you cant choose admin as username