Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Is there a way to continue after an exception ?

1 view
Skip to first unread message

Krister Svanlund

unread,
Feb 20, 2010, 6:59:40 PM2/20/10
to Stef Mientki, pytho...@python.org
On Sun, Feb 21, 2010 at 12:52 AM, Stef Mientki <stef.m...@gmail.com> wrote:
> hello,
>
> I would like my program to continue on the next line after an uncaught
> exception,
> is that possible ?
>
> thanks
> Stef Mientki
>

Yes, you catch the exception and do nothing.

Lie Ryan

unread,
Feb 20, 2010, 7:21:09 PM2/20/10
to
> On Sun, Feb 21, 2010 at 12:52 AM, Stef Mientki <stef.m...@gmail.com> wrote:
>> hello,
>>
>> I would like my program to continue on the next line after an uncaught
>> exception,
>> is that possible ?
>>
>> thanks
>> Stef Mientki
>>

That reminds me of VB's "On Error Resume Next"

Daniel Fetchinson

unread,
Feb 20, 2010, 7:32:53 PM2/20/10
to Python
> I would like my program to continue on the next line after an uncaught
> exception,
> is that possible ?

try:
# here is your error
except:
pass

# this will get executed no matter what

See http://docs.python.org/tutorial/errors.html

HTH,
Daniel

--
Psss, psss, put it down! - http://www.cafepress.com/putitdown

Lie Ryan

unread,
Feb 20, 2010, 9:17:47 PM2/20/10
to
On 02/21/10 12:02, Stef Mientki wrote:
> I think that's what I'm after ...

First, read this:
http://www.developerfusion.com/code/4325/on-error-resume-next-considered-harmful/

> I already redirected sys.excepthook to my own function,
> but now I need a way to get to continue the code on the next line.
> Is that possible ?

No, not in python. You can (ab)use generators' yield to resume
execution, but not in the general case:

def on_error_resume_next(func):
def _func(*args, **kwargs):
gen = func(*args, **kwargs)
resp = next(gen)
while isinstance(resp, Exception):
print 'an error happened, ignoring...'
resp = next(gen)
return resp
return _func

@on_error_resume_next
def add_ten_error_if_zero(args):
if args == 0:
# raise Exception()
yield Exception()
# return args + 10
yield args + 10

print add_ten_error_if_zero(0)
print add_ten_error_if_zero(10)


A slightly better approach is to retry calling the function again, but
as you can see, it's not appropriate for certain cases:

def retry_on_error(func):
def _func(*args, **kwargs):
while True:
try:
ret = func(*args, **kwargs)
except Exception:
print 'An error happened, retrying...'
else:
return ret
return _func

@retry_on_error
def add_ten_error_if_zero(args):
if args == 0:
raise Exception()
return args + 10

print add_ten_error_if_zero(0)
print add_ten_error_if_zero(10)

A much better approach is to use callbacks, the callbacks determines
whether to raise an exception or continue execution:

def handler(e):
if datetime.datetime.now() >= datetime.datetime(2012, 12, 21):
raise Exception('The world has ended')
# else: ignore, it's fine

def add_ten_error_if_zero(args, handler):
if args == 0:
handler(args)
return args + 10

print add_ten_error_if_zero(0, handler)
print add_ten_error_if_zero(10, handler)
print add_ten_error_if_zero(0, lambda e: None) # always succeeds

Ignoring arbitrary error is against the The Zen of Python "Errors should
never pass silently."; not that it is ever a good idea to ignore
arbitrary error, when an exception happens often the function is in an
indeterminate state, and continuing blindly could easily cause havocs.

sste...@gmail.com

unread,
Feb 20, 2010, 9:43:24 PM2/20/10
to Lie Ryan, pytho...@python.org

On Feb 20, 2010, at 9:17 PM, Lie Ryan wrote:

> On 02/21/10 12:02, Stef Mientki wrote:
>> On 21-02-2010 01:21, Lie Ryan wrote:
>>>> On Sun, Feb 21, 2010 at 12:52 AM, Stef Mientki
> <stef.m...@gmail.com> wrote:
>>>>
>>>>> hello,
>>>>>
>>>>> I would like my program to continue on the next line after an uncaught
>>>>> exception,
>>>>> is that possible ?
>>>>>
>>>>> thanks
>>>>> Stef Mientki
>>>>>
>>>>>
>>> That reminds me of VB's "On Error Resume Next"
>>>
>> I think that's what I'm after ...
>
> First, read this:
> http://www.developerfusion.com/code/4325/on-error-resume-next-considered-harmful/

The link goes to an "Oh dear. Gremlins at work!" page.

They're probably using On Error Resume Next in their VBScript code and this is the "last resort" page ;-).

S

Ryan Kelly

unread,
Feb 20, 2010, 9:51:21 PM2/20/10
to Lie Ryan, pytho...@python.org
On Sun, 2010-02-21 at 13:17 +1100, Lie Ryan wrote:
> On 02/21/10 12:02, Stef Mientki wrote:
> > On 21-02-2010 01:21, Lie Ryan wrote:
> >>> On Sun, Feb 21, 2010 at 12:52 AM, Stef Mientki
> <stef.m...@gmail.com> wrote:
> >>>
> >>>> hello,
> >>>>
> >>>> I would like my program to continue on the next line after an uncaught
> >>>> exception,
> >>>> is that possible ?
> >>>>
> >>>> thanks
> >>>> Stef Mientki
> >>>>
> >>>>
> >> That reminds me of VB's "On Error Resume Next"
> >>
> > I think that's what I'm after ...
>
> A much better approach is to use callbacks, the callbacks determines
> whether to raise an exception or continue execution:
>
> def handler(e):
> if datetime.datetime.now() >= datetime.datetime(2012, 12, 21):
> raise Exception('The world has ended')
> # else: ignore, it's fine
>
> def add_ten_error_if_zero(args, handler):
> if args == 0:
> handler(args)
> return args + 10
>
> print add_ten_error_if_zero(0, handler)
> print add_ten_error_if_zero(10, handler)
> print add_ten_error_if_zero(0, lambda e: None) # always succeeds


Or if you don't like having to explicitly manage callbacks, you can try
the "withrestart" module:

http://pypi.python.org/pypi/withrestart/

It tries to pinch some of the good ideas from Common Lisp's
error-handling system.

from withrestart import *

def add_ten_error_if_zero(n):
# This gives calling code the option to ignore
# the error, or raise a different one.
with restarts(skip,raise_error):
if n == 0:
raise ValueError
return n + 10

# This will raise ValueError
print add_ten_error_if_zero(0)

# This will print 10
with Handler(ValueError,"skip"):
print add_ten_error_if_zero(0)

# This will exit the python interpreter
with Handler(ValueError,"raise_error",SystemExit):
print add_ten_error_if_zero(0)

Cheers,

Ryan


--
Ryan Kelly
http://www.rfk.id.au | This message is digitally signed. Please visit
ry...@rfk.id.au | http://www.rfk.id.au/ramblings/gpg/ for details

signature.asc
0 new messages