Catching `ExceptionGroup` with ``++except*++`` will raise a `TypeError`.

== Why is this an issue?

Python 3.11 introduced ``++except*++`` and `ExceptionGroup`, making it possible to handle and raise multiple unrelated exceptions simultaneously.

In the example below, we gather multiple exceptions in an `ExceptionGroup`. This `ExceptionGroup` is then caught by a single except block:

[source,python]
----
try:
  exception_group = ExceptionGroup("Files not found", [FileNotFoundError("file1.py"), FileNotFoundError("file2.py")])

  raise exception_group

except ExceptionGroup as exceptions:
  # Do something with all the exceptions
  pass
----

To handle differently each type of exceptions present in an `ExceptionGroup`, we have to use the ``++except*++`` keyword.

[source,python]
----
try:
  exception_group = ExceptionGroup("Operation errors", [ValueError("Value bigger than 100"), TypeError("Type str is not allowed")])

  raise exception_group

except* ValueError as v:
  # Do something with only ValueErrors
  pass

except* TypeError as t:
  # Do something with only TypeErrors
  pass
----

While it is possible to catch the `ExceptionGroup` and `BaseExceptionGroup` types with `except`, a `TypeError` will be raised when this is done with ``++except*++``.


== How to fix it

Make sure to use `except` when catching ExceptionGroup errors.

=== Code examples


==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
try:
    ...
except* ExceptionGroup:  # Noncompliant: TypeError  
    pass

try:
    ...
except* (TypeError, ExceptionGroup):  # Noncompliant: TypeError
    pass
----

==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
try:
    ...
except ExceptionGroup:
    pass

try:
    ...
except (TypeError, ExceptionGroup):
    pass
----

== Resources

=== Documentation

* https://peps.python.org/pep-0654/#forbidden-combinations[PEP-654] - Forbidden combinations
