An anti-pattern I've often seen is using try/except incorrectly in an attempt at duck typing:
try: widget.frob() except AttibuteError: # widget can't be frobbed do_something_else()
This is fundamentally broken because it will conceal bugs in the widget.frob() method (ie, if there's a bug in widget.frob() which causes an AttibuteError to be raised).
In this situation, the only safe way to use try/except would be:
try: widget_frob = widget.frob except AttibuteError: # widget can't be frobbed do_something_else() else: widget_frob()
This ensures that bugs in widget.frob() won't be accidentally hidden.
Of course, this code is no where near as pretty as the "incorrect" version, which is why I've come to believe that using try/except for duck typing could be considered an anti-pattern, and that hasattr is generally preferable (except in situations where performance is important, as try/except will almost certainly be faster):
if hasattr(widget, "frob"): widget.frob() else: # widget can't be frobbed do_something_else()
And of course, all this goes without saying that a naked except: is always an absolutely terrible idea...