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?
except Exception:
pass
while True:
try:
f = open('filedoesnotexist.txt')` except:
pass
KeyboardInterrupt stops and exits the code. –
Dextral 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 print('this'); 1/0; print('this too');
? And say I have 10 commands, don't want to write 10 try except pass blocks. –
Wame ...
(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 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.
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 ...
(ellipsis) in except
clause instead of pass
: except Exception: ...
–
Vapor 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.
with
block? –
Handicapped try...catch: pass
, so if an exception is raised inside the block, execution will continue after the end of the block. –
Middleoftheroad with suppress(TypeError): return data[0]
(longer example: pastebin.com/gcvAGqEP) –
Overcareful 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 supress(myFunc, suppressedException, returnValueOnFailure)
? –
Kohlrabi 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 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 © 2022 - 2024 — McMap. All rights reserved.