[Python-ideas] Let try-except check the exception instance

Franklin? Lee leewangzhong+python at gmail.com
Thu May 31 01:55:34 EDT 2018


Would guards (such as from the switch-case discussions) be a good fit?

try:
    ...
except RuntimeError as e if e.message == "tie":
    ...


On Thu, May 31, 2018, 00:48 Danilo J. S. Bellini <danilo.bellini at gmail.com>
wrote:

> Hi!
> I was working on handling some exceptions from external software
> (e.g. database constraint triggers)
> switching the handler based on the messages that had been sent.
> Today we can do something like (running on Python 3.6.5):
>
>
> >>> try:
> ...     # [...]
> ...     session.commit() # Here it raises!
> ...     # [...]
> ... except DatabaseError as exc:
> ...     msg = get_db_error_msg_from_exception(exc)
> ...     if msg == "beyond_limit":
> ...         # [...]
> ...     elif msg == "no_funds":
> ...         # [...]
> ...     else:
> ...         raise
>
>
> That works, but I'd like to do something like:
>
>
> >>> try:
> ...     # [...]
> ... except BeyondLimit:
> ...     # [...]
> ... except NoFunds:
> ...     # [...]
>
>
> Creating classes to "match" the exception in their __instancecheck__.
> Well, I tried to do so. A simplified example would be:
>
>
> >>> class MsgCheckerMeta(type):
> ...     def __instancecheck__(cls, instance):
> ...         return str(instance) == cls.internal
> ...
> >>> class ExceptionHasMessage(Exception, metaclass=MsgCheckerMeta):
> ...     internal = "message"
>
>
> Using these new classes, we would get this:
>
>
> >>> try:
> ...     raise Exception("message")
> ... except ExceptionHasMessage:
> ...     print("Yeah!")
> ...
> Traceback (most recent call last):
>   File "<stdin>", line 2, in <module>
> Exception: message
>
>
> Yet,
>
>
> >>> isinstance(Exception("message"), ExceptionHasMessage)
> True
> >>> try:
> ...     raise Exception("message")
> ... except Exception as exc:
> ...     print(isinstance(exc, ExceptionHasMessage))
> ...
> True
>
>
> The idea is to allow catching exceptions beyond checking their MRO,
> using a class that checks the exception instance by implementing
> a custom __instancecheck__.
>
> --
> Danilo J. S. Bellini
> ---------------
> "*It is not our business to set up prohibitions, but to arrive at
> conventions.*" (R. Carnap)
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180531/b32a67d3/attachment.html>


More information about the Python-ideas mailing list