<div dir="ltr"><div>Current documentation says:</div><div><br></div><div>"An object is
compatible with an exception if it is the class or a base class of the exception
object or a tuple containing an item compatible with the exception."</div><div><br></div><div><a href="https://docs.python.org/3/reference/compound_stmts.html#the-try-statement">https://docs.python.org/3/reference/compound_stmts.html#the-try-statement</a></div><div><br></div><div>It is, in my opinion, not very clear from this that the __instancecheck__ mechanism is bypassed.</div><div><br></div><div>Should the documentation perhaps be adapted to explain that the class needs to actually occur in the MRO</div><div>and that virtual base classes are not considered for matching purposes?</div><div><br></div><div>"An object is
compatible with an exception if it is the class or a non-virtual base class of the exception
object or a tuple containing an item compatible with the exception.</div><div>The exception matching machinery ignores the __instancecheck__ mechanism."<br></div><div><br></div><div><br></div><div>Stephan<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2018-05-31 9:19 GMT+02:00 Terry Reedy <span dir="ltr"><<a href="mailto:tjreedy@udel.edu" target="_blank">tjreedy@udel.edu</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 5/31/2018 12:47 AM, Danilo J. S. Bellini wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi!<br>
I was working on handling some exceptions from external software<br>
(e.g. database constraint triggers)<br>
switching the handler based on the messages that had been sent.<br>
Today we can do something like (running on Python 3.6.5):<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
try:<br>
</blockquote></blockquote></blockquote>
...     # [...]<br>
...     session.commit() # Here it raises!<br>
...     # [...]<br>
... except DatabaseError as exc:<br>
...     msg = get_db_error_msg_from_exceptio<wbr>n(exc)<br>
...     if msg == "beyond_limit":<br>
...         # [...]<br>
...     elif msg == "no_funds":<br>
...         # [...]<br>
...     else:<br>
...         raise<br>
<br>
<br>
That works,<br>
</blockquote>
<br></span>
Yes, it works perfectly well, AND it exposes the fact that your code depends on the message, which I think is a good thing.<br>
<br>
As Stephen said, messages are intentionally not part of the defined API.  As a matter of curtesy, we usually restrict message changes to new versions and do not backport the change. An exception may be made if we decide that a message is sufficiently erroneous that is likely misleads people.  In any case, message dependent code may be version dependent.<span class="HOEnZb"><font color="#888888"><br>
<br>
-- <br>
Terry Jan Reedy</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
<br>
______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofco<wbr>nduct/</a><br>
</div></div></blockquote></div><br></div>