استثنای تعریف شده توسط کاربر در پایتون «User-defined exception in Python» برای مدیریت خطاهایی که در حین اجرای برنامه رخ میدهند استفاده میشوند. در پایتون استثناهای داخلی زیادی وجود دارد، گاهی ممکن است نیاز به ایجاد استثناهای خودمان داشته باشیم تا موقعیتهای خاصی را که مختص برنامهمان هستند مدیریت کنیم. به این استثناها، استثنای تعریف شده توسط کاربر در پایتون میگویند. برای مدیریت خطاها و استثنای تعریف شده توسط کاربر در پایتون، مکانیزم مدیریت استثنا را با استفاده از بلوکهای try و except انجام می دهیم.
مقدمه
استثنای تعریف شده توسط کاربر در پایتون یک ابزار قدرتمند است که به برنامهنویسان این امکان را میدهد تا شرایط خاص و خطاهای دلخواه خود را به صورت دقیقتر مدیریت کنند. در پایتون، استثناها به طور پیشفرض برای خطاهای مختلف مانند تقسیم بر صفر، دسترسی به ایندکس ناموجود در لیست و خطاهای ورودی و خروجی وجود دارند، اما گاهی اوقات نیاز به تعریف خطاهای خاصتر و ویژه برای برنامههای پیچیدهتر داریم.
استثنای تعریف شده توسط کاربر در پایتون به ما این امکان را میدهد که خطاهای جدیدی را با نامها و ویژگیهای خاص خود ایجاد کنیم و به این ترتیب، برنامهنویسی «Programming» ما انعطافپذیرتر و دقیقتر خواهد شد. این استثناها میتوانند شامل پیامهای خطای سفارشی «Custom error messages» باشند که به راحتی به شناسایی مشکلات خاص در کد کمک میکنند.
در پایتون، برای ایجاد یک استثنای جدید، از کلاسهای استثنا که از کلاس پایه Exception ارثبری میکنند، استفاده میشود. این استثناها میتوانند برای شرایط خاصی طراحی شوند که به طور معمول در استثناهای پیشفرض پایتون وجود ندارند، و به این ترتیب تجربهای بهتر از مدیریت خطاها فراهم میآورند.
ایجاد استثنای تعریف شده توسط کاربر در پایتون
استثنای تعریف شده توسط کاربر در پایتون با تعریف یک کلاس جدید که از کلاس داخلی Exception پایتون یا یکی از زیرکلاسهای آن ارثبری میکند، ایجاد میشوند. با این کار میتوانیم پیامهای خطای سفارشی ایجاد کنیم و خطاهای خاص را به روشی که برای برنامهمان منطقی است مدیریت کنیم.
مراحل ایجاد و استفاده از استثنای تعریف شده توسط کاربر در پایتون
- تعریف یک کلاس استثناء جدید: یک کلاس جدید ایجاد کنید که از کلاس Exception یا هر یک از زیرکلاسهای آن ارثبری کند.
- برجسته کردن استثناء: از دستور raise برای برجسته کردن استثناء تعریفشده توسط کاربر استفاده کنید زمانی که یک شرایط خاص رخ دهد.
- مدیریت استثناء: از بلوکهای try-except برای مدیریت استثناء تعریفشده توسط کاربر استفاده کنید.
مثال از یک استثنای تعریف شده توسط کاربر در پایتون :
# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self, age, msg="Age must be between 0 and 120"): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f"Age set to: {age}") # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
خروجی:
۱۵۰ -> Age must be between 0 and 120
کلاس InvalidAgeError از کلاس Exception ارثبری میکند. این کلاس یک متد __init__ دارد که یک سن و یک پیام اختیاری را میگیرد. متد __str__ یک رشته بازمیگرداند که هنگام چاپ استثنا نمایش داده میشود.
در تابع set_age بررسی میکنیم که آیا سن خارج از بازه معتبر (۰ تا ۱۲۰) است یا خیر. اگر اینطور باشد، استثنا InvalidAgeError را برجسته میکنیم.
از بلوک try-except برای گرفتن و مدیریت InvalidAgeError استفاده میکنیم. وقتی این خطا برجسته میشود، پیام خطا چاپ میشود.
سفارشیسازی کلاس های استثنا در پایتون
وقتی یک استثنا سفارشی ایجاد میکنیم، از کلاس داخلی Exception پایتون (یا یک زیرکلاس مانند ValueError، TypeError و غیره) ارثبری میکنیم. سپس میتوانیم ویژگیها، متدها یا منطق سفارشی خود را اضافه کنیم تا استثناء ما اطلاعات بیشتری فراهم کند.
# Step 1: Subclass the Exception class class InvalidAgeError(Exception): def __init__(self, age, msg="Age must be between 0 and 120", error_code=1001): # Custom attributes self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) # Call the base class constructor # Step 2: Customize the string representation of the exception def __str__(self): return f"[Error Code {self.error_code}] {self.age} -> {self.msg}" # Step 3: Raising the custom exception def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f"Age set to: {age}") # Step 4: Handling the custom exception with additional information try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
خروجی:
[Error Code 1001] 150 -> Age must be between 0 and 120
متد __str__ بازنویسی شده است تا یک پیام خطای سفارشی هنگام چاپ استثنا ارائه دهد. این پیام شامل کد خطا و سن است که آن را بیشتر توضیحی میکند.
در تابع set_age، اگر سن نامعتبر باشد، استثنا سفارشی InvalidAgeError برجسته میشود. سپس استثنا در بلوک try-except گرفته میشود و پیام خطای سفارشی چاپ میشود.
چگونه از استثناهای استاندارد بهعنوان کلاس پایه در پایتون استفاده کنیم؟
یک خطای زمان اجرا، کلاسی است که یک استثنا استاندارد است و زمانی برجسته میشود که یک خطای ایجادشده در هیچ کدام از دستههای موجود قرار نگیرد. این برنامه نشان میدهد چگونه از خطای زمان اجرا بهعنوان کلاس پایه استفاده کنیم و خطای شبکه را بهعنوان یک کلاس مشتقشده از آن تعریف کنیم. به همین صورت، میتوان یک استثنا را از استثناهای استاندارد پایتون مشتق کرد.
# NetworkError has base RuntimeError and not Exception class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg try: raise Networkerror("Error") except Networkerror as e: print(e.args)
خروجی:
('E', 'r', 'r', 'o', 'r')
نتیجهگیری
استثنای تعریفشده توسط کاربر در پایتون به توسعهدهندگان این امکان را میدهند که خطاهایی را که به طور پیشفرض توسط پایتون شناسایی نمیشوند، شبیهسازی و مدیریت کنند. این قابلیت انعطافپذیری بالایی را فراهم میکند و به برنامهنویسان اجازه میدهد که منطق خاص خود را برای مدیریت استثناءها پیادهسازی کنند. با استفاده از این نوع استثناها، خطاها را میتوان بهصورت خاصتری شناسایی کرد و پیامهای خطای دقیقتری برای کاربران ارائه داد. این کار نهتنها باعث بهبود تجربه کاربری میشود، بلکه به توسعهدهندگان کمک میکند تا اشکالات را سریعتر رفع کنند. همچنین، ایجاد استثناهای خاص به کاهش پیچیدگی کد کمک میکند، زیرا مدیریت خطاها به شکل ساختاریافتهتری انجام میشود.
علاوه بر این، استثناهای سفارشی میتوانند نقش مهمی در بهبود رابط کاربری ایفا کنند. نمایش پیامهای خطای مرتبط و دقیق به کاربران و توسعهدهندگان کمک میکند تا مشکلات را بهتر درک کرده و سریعتر برطرف کنند. در نهایت، استفاده از استثناهای تعریفشده توسط کاربر باعث ایجاد کدی پایدارتر، قابلاعتمادتر و عاری از خطاهای غیرمنتظره میشود.