Python: How to ignore an exception and proceed? [duplicate]
Asked Answered
B

4

577

I have a try...except block in my code and When an exception is throw. I really just want to continue with the code because in that case, everything is still able to run just fine. The problem is if you leave the except: block empty or with a #do nothing, it gives you a syntax error. I can't use continue because its not in a loop. Is there a keyword i can use that tells the code to just keep going?

Benefactor answered 22/2, 2009 at 11:2 Comment(0)
E
845
except Exception:
    pass

Python docs for the pass statement

Expectorate answered 22/2, 2009 at 11:3 Comment(8)
except Exception: pass # important not to swallow other exceptions!Keyte
This will catch SystemExit, KeyboardInterrupt and other things that you probably don't want to catch.Misconceive
It won't catch KeyboardInterrupt. For example: while True: try: f = open('filedoesnotexist.txt')` except: pass KeyboardInterrupt stops and exits the code.Dextral
@ChthonicProject a bare except will catch any exception, including a KeyboardInterrupt, but only if it happens inside the try. In your example there, a KeyboardInterrupt can occur before the try or inside the except, where it won't be caught. If you run an example like while True: try: pass except: pass, you'll find that the KeyboardInterrupt gets caught just about 50% of the time. If you time.sleep(1) inside the try, you'll find that it gets caught almost every time.Middleoftheroad
This stops executing after the first exception. What I just want to totally ignore all exceptions, eg print('this'); 1/0; print('this too');? And say I have 10 commands, don't want to write 10 try except pass blocks.Wame
One also can use ... (ellipsis) in except clause instead of pass: except: ...Vapor
is just an expression like 1 or True or None or NotImplemented, all of which can be used as quasi-nops (and pass still beats them because it produces exactly 0 (zero) opcodes for the Python VM to execute (in CPython that is)).Raspberry
How does this compare to try: xxx() finally: pass?Fisken
R
345

Generic answer

The standard "nop" in Python is the pass statement:

try:
    do_something()
except Exception:
    pass

Using except Exception instead of a bare except avoid catching exceptions like SystemExit, KeyboardInterrupt etc.

Python 2

Because of the last thrown exception being remembered in Python 2, some of the objects involved in the exception-throwing statement are being kept live indefinitely (actually, until the next exception). In case this is important for you and (typically) you don't need to remember the last thrown exception, you might want to do the following instead of pass:

try:
    do_something()
except Exception:
    sys.exc_clear()

This clears the last thrown exception.

Python 3

In Python 3, the variable that holds the exception instance gets deleted on exiting the except block. Even if the variable held a value previously, after entering and exiting the except block it becomes undefined again.

Raspberry answered 22/2, 2009 at 20:23 Comment(5)
This is a better answer than the one that was accepted because it uses "except Exception:" instead of just "except:" which as others have pointed out will improperly swallow other things that you don't want to catch like SystemExit and KeyboardInterrupt.Garden
+1 It also clears the error which is important when running unittests and expecting exceptionsDisbranch
Note that exc_clear was removed in python 3. docs.python.org/3/whatsnew/3.0.html#index-22. For some ways to address this in Python 3 see here: cosmicpercolator.com/2016/01/13/…Anguished
See https://mcmap.net/q/53329/-how-to-properly-ignore-exceptions for quickly ignoring multiple exceptionsWame
One also can use ... (ellipsis) in except clause instead of pass: except Exception: ...Vapor
A
305

There's a new way to do this coming in Python 3.4:

from contextlib import suppress

with suppress(Exception):
  # your code

Here's the commit that added it: http://hg.python.org/cpython/rev/406b47c64480

And here's the author, Raymond Hettinger, talking about this and all sorts of other Python hotness (relevant bit at 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go

If you wanted to emulate the bare except keyword and also ignore things like KeyboardInterrupt—though you usually don't—you could use with suppress(BaseException).

Edit: Looks like ignored was renamed to suppress before the 3.4 release.

Aerography answered 22/3, 2013 at 8:41 Comment(9)
I'm not sure I like this solution... I guess the idea is we've replaced 3 lines with just 1 (the try, except, and pass are all merged into one.) The main thing I object to is how this introduces a new keyword that seems to vindicate something you probably shouldn't be doing... it seems like you should always at least log exceptions you're catching...Godless
When an exception is raised will it continue the code after the try/catch or whatever is outside of the with block?Handicapped
This is equivalent to wrapping your code in a try...catch: pass, so if an exception is raised inside the block, execution will continue after the end of the block.Middleoftheroad
@Godless What if I said, I'll give you an integer, but sometimes I'll give it to you in a singleton tuple, and I won't tell you when I do one or the other; now your job is to always give me back the integer? Perhaps you would appreciate being able to write something like with suppress(TypeError): return data[0] (longer example: pastebin.com/gcvAGqEP)Overcareful
@Navin Python can't just pretend that an exception didn't exist. Suppose I have a statement like y = f(x) * g(x), and then f(x) raises an exception. Even if Python ignores it, f(x) never returns a value, so there's no way for Python to assign a value to y. The designers could've said "assume a value of None" or "skip statements containing any expression that failed to evaluate," but that would end up being very confusing. Using try blocks to group statements that fail together keeps things simple.Middleoftheroad
@JackO'Connor Fair enough. I was hoping there would be a way to replace an expressions with None if it raises an exception.Undersurface
Can it be done inline? For instance something like supress(myFunc, suppressedException, returnValueOnFailure)?Kohlrabi
@JeromeJ you can't do that with suppress directly, because it's a context manager. (For details about how context managers work, see here: docs.python.org/3.4/library/stdtypes.html#typecontextmanager) But it would be pretty simple to define your own callCatchingExceptions function that used suppress or an ordinary try block on the inside, if you wanted.Middleoftheroad
FYI, django revert the use of with suppress(Exception) on 2017-09 , because try/except performs better. Check this commits Reverted "Fixed #27818 -- Replaced try/except/pass with contextlib.su…Avery
S
28

Try this:

try:
    blah()
except:
    pass
Stringfellow answered 22/2, 2009 at 11:4 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.