برای اطمینان از اینکه بخشی از کد همیشه اجرا شود، صرفنظر از وقوع خطا یا استثنا، میتوانید از بلوک 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* ابزارهای قدرتمندی هستند که باعث بهبود مدیریت استثناها در برنامههای پیچیده و موازی میشوند، مخصوصاً زمانی که چندین خطا به طور همزمان ممکن است رخ دهند.