pep*_*ero 2 python command-line exception-handling
嗨,大家好.
我正在使用cmd和optparse来开发CLI.py,用于已经功能的类(CDContainer,CD等)的集合.以下是代码的某些部分.我这里有问题.当存在异常(错误的输入类型或缺少值)时,optparse将退出整个程序而不是特定的命令方法.
import cmd
class CLI(cmd.Cmd):
def do_addcd(self, line):
args=line.split()
parser = OptionParser()
parser.add_option("-t", "--track", dest="track_number", type="int",
help="track number")
parser.add_option("-n", "--cdname", dest="cd_name", type="string",
help="CD name")
(options, positional_args) = parser.parse_args(args[0:])
cd_obj= CD()
cd_obj.addCD(options.track_number, options.cd_name)
Run Code Online (Sandbox Code Playgroud)
在"> python"下,如果我输入CLI.py,那么我将有(Cmd),所以我可以键入命令"(Cmd)addcd -t 3 -n thriller".但如果我输入"addcd -tr -n 3",那么optparse将终止整个CLI.py并退出.这对我不好.我想提醒用户每个方法,而不是终止整个程序.
然而,optparse文档说"整个程序退出".所以我不能"盲目地"使用optparse.我能做什么?
Rob*_*sak 10
该optparse文件说,这样的:
如果optparse的默认错误处理行为不符合您的需求,您需要继承OptionParser并覆盖其exit()和/或error()方法.
理想情况下,您将定义一种新类型的异常,子类optparse,在您重写的exit()or error()方法中引发异常,然后捕获它并根据需要处理它.
不过你可以作弊.如果您希望打印错误消息,但只是不希望程序退出,那么您可以捕获SystemExit异常以捕获optparse尝试退出和停止它的位置.
所以,例如:
try:
(options, positional_args) = parser.parse_args(args[0:])
except SystemExit:
return
cd_obj= CD()
cd_obj.addCD(options.track_number, options.cd_name)
Run Code Online (Sandbox Code Playgroud)
或覆盖方法:
import optparse
class OptionParsingError(RuntimeError):
def __init__(self, msg):
self.msg = msg
class OptionParsingExit(Exception):
def __init__(self, status, msg):
self.msg = msg
self.status = status
class ModifiedOptionParser(optparse.OptionParser):
def error(self, msg):
raise OptionParsingError(msg)
def exit(self, status=0, msg=None):
raise OptionParsingExit(status, msg)
Run Code Online (Sandbox Code Playgroud)
然后:
try:
parser = ModifiedOptionParser()
parser.add_option("-t", "--track", dest="track_number", type="int",
help="track number")
(options, positional_args) = parser.parse_args(args[0:])
except OptionParsingError, e:
print 'There was a parsing error: %s' % e.msg
return
except OptionParsingExit, e:
print 'The option parser exited with message %s and result code %s' % (e.msg, e.status)
return
cd_obj= CD()
cd_obj.addCD(options.track_number, options.cd_name)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4632 次 |
| 最近记录: |