برای اطمینان از اینکه بخشی از کد همیشه اجرا شود، صرفنظر از وقوع خطا یا استثنا، میتوانید از بلوک finally
استفاده کنید. این بلوک در انتهای ساختار try/except
قرار میگیرد و کد داخل آن همیشه پس از اجرای کدهای try
و در صورت وجود، بلوکهای except
اجرا خواهد شد.
try:
print("Hello")
print(1 / 0)
except ZeroDivisionError:
print("Divided by zero")
finally:
print("This code will run no matter what")
خروجی:
Hello
Divided by zero
This code will run no matter what
کد داخل بلوک finally
حتی اگر در بلوک except
خطایی رخ دهد نیز اجرا میشود، مانند مثال زیر:
try:
print(1)
print(10 / 0)
except ZeroDivisionError:
print(unknown_var) # This will raise NameError
finally:
print("This is executed last")
خروجی:
1
This is executed last
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
NameError: name 'unknown_var' is not defined
علاوه بر try
، except
و finally
، میتوانید از بلوک else
نیز استفاده کنید. کد داخل else
فقط زمانی اجرا میشود که در بلوک try
هیچ استثنایی رخ ندهد. ترتیب اجرای این بلوکها به شکل زیر است:
- try اجرا میشود.
- except مربوطه اجرا میشود و بلوک
else
نادیده گرفته میشود. - else اجرا میشود.
- finally همیشه اجرا میشود، صرفنظر از وقوع خطا یا خیر.
نمونهای از استفاده از else
همراه با سایر بلوکها:
try:
result = 10 / 2
except ZeroDivisionError:
print("Division by zero!")
else:
print(f"Result is {result}")
finally:
print("Execution completed.")
خروجی:
Result is 5.0
Execution completed.
در نسخههای جدید پایتون (از پایتون 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*
ابزارهای قدرتمندی هستند که باعث بهبود مدیریت استثناها در برنامههای پیچیده و موازی میشوند، مخصوصاً زمانی که چندین خطا به طور همزمان ممکن است رخ دهند.