برای ایجاد و پرتاب یک استثنا (Exception)، میتوانید از دستور raise استفاده کنید. این دستور باعث میشود اجرای برنامه متوقف شده و خطای مشخص شده صادر شود.
print(1)
raise ValueError
print(2) # این خط اجرا نمیشود
خروجی:
>>>
1
ValueError
>>>
نکته: هنگام استفاده از raise باید نوع استثنا را مشخص کنید. همچنین میتوانید پیام خطای دلخواه یا دادههای اضافی را به عنوان آرگومان به استثنا ارسال کنید تا اطلاعات بیشتری ارائه شود. مثلاً:
name = "123"
raise NameError("Invalid name!")
خروجی:
>>>
NameError: Invalid name!
>>>
در بلوک except نیز میتوان با استفاده از raise بدون آرگومان، استثنای فعلی را دوباره پرتاب کرد. این کار برای انتقال خطا به لایههای بالاتر و یا ثبت خطا قبل از ادامهی پرتاب آن مفید است. مثلاً:
try:
num = 5 / 0
except:
print("An error occurred")
raise
خروجی:
>>>
An error occurred
ZeroDivisionError: division by zero
>>>
استفاده از args برای دسترسی به پارامترهای خطا
هر شیء استثنا دارای ویژگی args است که پارامترهای ارسالشده به استثنا را به صورت یک tuple برمیگرداند:
try:
raise ValueError("value error message", 42)
except ValueError as e:
print(f"exception: {e}")
print(f"args: {e.args}")
print(f"arg 0: {e.args[0]}")
print(f"arg 1: {e.args[1]}")
خروجی:
exception: ('value error message', 42)
args: ('value error message', 42)
arg 0: value error message
arg 1: 42
در نسخههای جدید پایتون (از پایتون 3.11 به بعد)، قابلیت Exception Groups و کلیدواژه except* معرفی شده است تا بتوان همزمان چند استثنا (Exception) را در قالب یک گروه مدیریت کرد. این ویژگی برای مواقعی کاربرد دارد که چند خطا به طور همزمان رخ دهند، مثل در برنامههای موازی یا همزمان (concurrent)، و نیاز باشد به صورت یکجا آنها را دستهبندی و هندل کرد.
در حالت معمولی، اگر چند خطا همزمان رخ دهند، پایتون فقط اولین خطا را نمایش میدهد و بقیه از دست میروند. اما با Exception Groups میتوان چندین خطا را در قالب یک گروه (exception group) جمعآوری کرد و با استفاده از except* آنها را جداگانه یا گروهی مدیریت کرد.
نمونه سادهای از ExceptionGroup و except*:
try:
raise ExceptionGroup("Multiple errors occurred", [
ValueError("Invalid value"),
TypeError("Wrong type")
])
except* ValueError as e:
print(f"Caught ValueError: {e}")
except* TypeError as e:
print(f"Caught TypeError: {e}")
خروجی:
Caught ValueError: Invalid value
Caught TypeError: Wrong type
توضیح:
- در این مثال، یک
ExceptionGroupایجاد شده که دو استثنا یعنیValueErrorوTypeErrorرا در خود دارد. - با استفاده از
except*میتوان به صورت جداگانه هر نوع استثنا را مدیریت کرد. - این امکان اجازه میدهد که خطاهای مختلف را به صورت موازی و همزمان هندل کنیم بدون اینکه یکی باعث نادیده گرفتن دیگری شود.
در کل، ExceptionGroup و except* ابزارهای قدرتمندی هستند که باعث بهبود مدیریت استثناها در برنامههای پیچیده و موازی میشوند، مخصوصاً زمانی که چندین خطا به طور همزمان ممکن است رخ دهند.