Re: Is there a way to continue after an exception ?
On 21-02-2010 03:51, Ryan Kelly wrote: 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.mien...@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 thanks Ryan (and others), your description of withstart was very informative, and I think I understand why it's impossible what I want (something like madExcept for Delphi / C / C++, see *http://www.madshi.net/madExceptDescription.htm ) * It are not the bugs that you can predict / expect to catch, but the uncaught bugs. So made some first steps, and this seems to be sufficient for now, if you're interested, look here, http://mientki.ruhosting.nl/data_www/pylab_works/pw_bug_reporter.html cheers, Stef -- http://mail.python.org/mailman/listinfo/python-list
Is there a way to continue after an exception ?
hello, I would like my program to continue on the next line after an uncaught exception, is that possible ? thanks Stef Mientki -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a way to continue after an exception ?
On Sun, Feb 21, 2010 at 12:52 AM, Stef Mientki stef.mien...@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. -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a way to continue after an exception ?
On Sun, Feb 21, 2010 at 12:52 AM, Stef Mientki stef.mien...@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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a way to continue after an exception ?
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.mien...@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/ 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. -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a way to continue after an exception ?
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.mien...@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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a way to continue after an exception ?
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.mien...@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 r...@rfk.id.au| http://www.rfk.id.au/ramblings/gpg/ for details signature.asc Description: This is a digitally signed message part -- http://mail.python.org/mailman/listinfo/python-list