موقعیتهایی وجود دارد که گزارش دادن چندین استثناء که رخ دادهاند ضروری است. این اغلب در چارچوبهای همزمانی پیش میآید، وقتی چندین کار ممکن است به طور موازی ناموفق شده باشند، اما موارد استفاده دیگری هم وجود دارد که ادامه اجرا و جمعآوری چندین خطا به جای ایجاد اولین استثناء مطلوب است.
ExceptionGroup داخلی یک لیست از نمونههای استیکه را میپیچد تا بتوانند به صورت یکپارچه ایجاد شوند. این خود یک استثناء است، بنابراین میتواند مانند هر استثناء دیگری گرفته شود.
>>> def f():
... excs = [OSError('error 1'), SystemError('error 2')]
... raise ExceptionGroup('there were problems', excs)
...
>>> f()
+ Exception Group Traceback (most recent call last):
| File "", line 1, in
| f()
| ~^^
| File "", line 3, in f
| raise ExceptionGroup('there were problems', excs)
| ExceptionGroup: there were problems (2 sub-exceptions)
+-+---------------- 1 ----------------
| OSError: error 1
+---------------- 2 ----------------
| SystemError: error 2
+------------------------------------
با استفاده از except* به جای except، میتوانیم به طور انتخابی فقط استثناءهایی در گروه را مدیریت کنیم که با نوع خاصی مطابقت دارند. در مثال زیر، که یک گروه استثناء تودرتو را نشان میدهد، هر بند except* استثناءهای یک نوع خاص را از گروه استخراج میکند در حالی که تمام استثناءهای دیگر را به بندهای دیگر و در نهایت برای بازایجاد کردن منتقل میکند.
>>> def f():
... raise ExceptionGroup(
... "group1",
... [
... OSError(1),
... SystemError(2),
... ExceptionGroup(
... "group2",
... [
... OSError(3),
... RecursionError(4)
... ]
... )
... ]
... )
...
>>> try:
... f()
... except* OSError as e:
... print("There were OSErrors")
... except* SystemError as e:
... print("There were SystemErrors")
...
There were OSErrors
There were SystemErrors
+ Exception Group Traceback (most recent call last):
| File "", line 2, in
| f()
| ~^^
| File "", line 2, in f
| raise ExceptionGroup(
| ...<12 lines>...
| )
| ExceptionGroup: group1 (1 sub-exception)
+-+---------------- 1 ----------------
| ExceptionGroup: group2 (1 sub-exception)
+-+---------------- 1 ----------------
| RecursionError: 4
+------------------------------------
توجه کنید که استثناءهای تودرتو در یک گروه استثناء باید نمونهها باشند، نه انواع. این به این دلیل است که در عمل استثناءها معمولاً آنهایی هستند که قبلاً ایجاد و توسط برنامه گرفته شدهاند، با الگوهای زیر:
>>> excs = []
>>> for test in tests:
... try:
... test.run()
... except Exception as e:
... excs.append(e)
...
>>> if excs:
... raise ExceptionGroup("Test Failures", excs)
...این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial