Say I have a function that can produce a vast variety of errors.

I have a ValueError that I need to catch, a specific AttributeError, and then I also need to handle any other type of error.

```py
try:
  func()
except AttributeError as e:
  if "specific error text" in str(e):
    print("The specific AttributeError occurred")
  else:
    raise
except ValueError:
  print("A value error occurred")
except Exception as e:
  print("Another error occurred: {}".format(str(e)))

```

Problem: If `func()` bubbles an `AttributeError` that's not the specific one I'm looking for, in this case, it'll be re-raised and not handled how I want it to be handled (via the general `Exception` handler).

How do I force non-specific errors to be handled further down in the chain, without duplicating code from the `Exception` section into the `AttributeError` section?