On Mon, Jan 27, 2014 at 12:02 AM, me <no...@all.net> wrote: > On Mon, 27 Jan 2014 00:36:20 -0500, Dave Angel wrote: > >> sys.exit() raises an exception, and you're deliberately eating >> that exception. >> > > I can buy that sys.exit (may) be throwing an exception...My point of > contention isn't that I may be throwing one, but why would a subsequent > "raise" in the except: clause cause the point of program execution to > jump back up to the sys.exit(0) and then function correctly.
You've missed the point here. sys.exit() *does* raise an exception: SystemExit, a subclass of BaseException. In fact, you can implement sys.exit in pure Python like so: def exit(status): raise SystemExit(status) Your bare 'except:' catches that SystemExit along with any other possible exception; the bare 'raise' in the except clause just re-raises the same SystemExit, which then does what you meant for it to do in the first place. Exception classes form a hierarchy, with BaseException being the base (obviously :)), "except:" is really just shorthand for "except BaseException:", and is very rarely a good idea. Deriving from BaseException are SystemExit, KeyboardInterrupt, and Exception. SystemExit is the exception raised by sys.exit(), which if left unhandled, the interpreter takes as a sign to shut down gracefully. KeyboardInterrupt is raised by Ctrl+C, or (more accurately, if I'm not mistaken) by sending SIGINT to the process. Exception is the base class for all other exceptions, such as TypeError, ValueError, OSError, etc., and is what you actually want to catch if you really don't care what exception is raised but want to handle it (though in most cases, you either should care, or should at least report what the exception was, preferably with a traceback...which is easiest to do by not trying to catch the exception at all). I would suggest skimming through the Python tutorial and/or language reference if you haven't before, there's a lot of good information in there that will make your life with Python much easier. And, please take this positively, but from your posted code it's fairly apparent that Python is not your native tongue :). For instance, you don't need the backslashes in your defaultparams assignment; the parser knows it needs to keep looking on subsequent lines when it hasn't found the closing '}' yet. Also, you can iterate over a (sys.argv) in a for loop, replacing 'l', 'idx', and the while loop; something like for arg in a: if arg == '-h': print help # help being defined elsewhere... elif arg == '-hh': # no really, print help print 'help' And the big one, argument parsing is a solved problem in Python. Check out the argparse module in the standard library (or if you're using an older version of Python, try either optparse or getopt. It's really a thrice-solved problem ;)). I hope I've been of some help, -- Zach -- https://mail.python.org/mailman/listinfo/python-list