آموزش پایتون - تعریف استثنا

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

استثناهای تعریف‌شده توسط کاربر (User-Defined Exceptions) در پایتون، کلاس‌های خطای سفارشی هستند که شما برای مدیریت شرایط خطای خاص در کد خود ایجاد می‌کنید. آن‌ها از کلاس توکار Exception یا هر یک از زیرکلاس‌های آن ارث‌بری می‌کنند.

استثناهای تعریف‌شده توسط کاربر کنترل دقیق‌تری روی مدیریت خطا در برنامه شما ارائه می‌دهند −

  • شفافیت − آن‌ها پیام‌های خطای مشخصی ارائه می‌دهند که روشن می‌سازد چه مشکلی پیش آمده است.

  • جزئی‌نگری − آن‌ها به شما اجازه می‌دهند شرایط خطای مختلف را به صورت جداگانه مدیریت کنید.

  • قابلیت نگهداری − آن‌ها منطق مدیریت خطا را متمرکز می‌کنند و نگهداری کد شما را آسان‌تر می‌سازند.

نحوه ایجاد یک استثنای تعریف‌شده توسط کاربر

برای ایجاد یک استثنای تعریف‌شده توسط کاربر، این مراحل را دنبال کنید −

مرحله ۱ − تعریف کلاس استثنا

یک کلاس جدید ایجاد کنید که از کلاس توکار "Exception" یا هر کلاس پایه مناسب دیگری ارث‌بری کند. این کلاس جدید به‌عنوان استثنای سفارشی شما عمل خواهد کرد.

class MyCustomError(Exception):
   pass

توضیح

  • وراثت − با ارث‌بری از "Exception"، استثنای سفارشی شما همان رفتار و ویژگی‌های استثناهای توکار را خواهد داشت.

  • تعریف کلاس − کلاس با استفاده از ساختار استاندارد کلاس در پایتون تعریف می‌شود. برای استثناهای سفارشی ساده، می‌توانید با استفاده از دستور "pass" یک بدنه کلاس خالی تعریف کنید.

مرحله ۲ − مقداردهی اولیه استثنا

متد "__init__" را برای مقداردهی اولیه هرگونه ویژگی یا ارائه پیام‌های خطای سفارشی پیاده‌سازی کنید. این کار به شما امکان می‌دهد هنگام فراخوانی (Raise) استثنا، اطلاعات خاصی در مورد خطا ارسال کنید.

class InvalidAgeError(Exception):
   def __init__(self, age, message="Age must be between 18 and 100"):
      self.age = age
      self.message = message
      super().__init__(self.message)

توضیح

  • ویژگی‌ها − ویژگی‌هایی مانند "age" و "message" را برای ذخیره اطلاعات مربوط به خطا تعریف کنید.

  • مقداردهی اولیه − متد "__init__" این ویژگی‌ها را مقداردهی اولیه می‌کند. فراخوانی "super().__init__(self.message)" تضمین می‌کند که کلاس پایه "Exception" به درستی با پیام خطا مقداردهی اولیه شده است.

  • پیام پیش‌فرض − یک پیام پیش‌فرض ارائه شده است، اما می‌توانید هنگام فراخوانی استثنا آن را بازنویسی کنید.

مرحله ۳ − بازنویسی اختیاری "__str__" یا "__repr__"

متد "__str__" یا "__repr__" را بازنویسی کنید تا یک بازنمایی رشته‌ای سفارشی از استثنا ارائه دهید. این کار برای چاپ یا ثبت (Log) استثنا مفید است.

class InvalidAgeError(Exception):
   def __init__(self, age, message="Age must be between 18 and 100"):
      self.age = age
      self.message = message
      super().__init__(self.message)

   def __str__(self):
      return f"{self.message}. Provided age: {self.age}"

توضیح

  • متد __str__ − متد "__str__" یک بازنمایی رشته‌ای از استثنا را برمی‌گرداند. این همان چیزی است که هنگام چاپ استثنا نمایش داده خواهد شد.

  • پیام سفارشی − پیام را طوری سفارشی‌سازی کنید که شامل اطلاعات مرتبط باشد، مانند سن ارائه شده در این مثال.

فراخوانی استثناهای تعریف‌شده توسط کاربر

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

ساختار (Syntax)

در ادامه ساختار پایه برای فراخوانی یک استثنا آمده است −

raise ExceptionType(args)

مثال

در این مثال، اگر سن خارج از محدوده معتبر باشد، تابع "set_age" یک استثنای "InvalidAgeError" را فراخوانی می‌کند −

def set_age(age):
   if age < 18 or age > 100:
      raise InvalidAgeError(age)
   print(f"Age is set to {age}")

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

مدیریت استثناهای تعریف‌شده توسط کاربر در پایتون به معنای استفاده از بلوک‌های "try-except" برای دریافت و پاسخ به شرایط خاصی است که استثناهای سفارشی شما نماینده آن هستند. این کار به برنامه شما اجازه می‌دهد تا خطاها را به نرمی مدیریت کند و به اجرا ادامه دهد یا بر اساس نوع استثنای فراخوانی شده، اقدامات خاصی انجام دهد.

ساختار (Syntax)

در ادامه ساختار پایه برای مدیریت استثناها آمده است −

try:
   # Code that may raise an exception
except ExceptionType as e:
   # Code to handle the exception

مثال

در مثال زیر، بلوک "try" تابع "set_age" را با یک سن نامعتبر فراخوانی می‌کند. بلوک "except" استثنای "InvalidAgeError" را دریافت کرده و پیام خطای سفارشی را چاپ می‌کند −

try:
   set_age(150)
except InvalidAgeError as e:
   print(f"Invalid age: {e.age}. {e.message}")

مثال کامل

با ترکیب تمامی مراحل، در اینجا یک مثال کامل از ایجاد و استفاده از یک استثنای تعریف‌شده توسط کاربر آمده است −

class InvalidAgeError(Exception):
   def __init__(self, age, message="Age must be between 18 and 100"):
      self.age = age
      self.message = message
      super().__init__(self.message)

   def __str__(self):
     return f"{self.message}. Provided age: {self.age}"

def set_age(age):
   if age < 18 or age > 100:
      raise InvalidAgeError(age)
   print(f"Age is set to {age}")

try:
   set_age(150)
except InvalidAgeError as e:
   print(f"Invalid age: {e.age}. {e.message}")

در ادامه خروجی کد بالا آمده است −

Invalid age: 150. Age must be between 18 and 100

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.