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

2010-02-21 Thread Stef Mientki

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 ?

2010-02-20 Thread Stef Mientki

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 ?

2010-02-20 Thread Krister Svanlund
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 ?

2010-02-20 Thread Lie Ryan
 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 ?

2010-02-20 Thread Lie Ryan
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 ?

2010-02-20 Thread sstein...@gmail.com

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 ?

2010-02-20 Thread Ryan Kelly
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