python的optparse异常处理
嗨,伙计们 我正在使用cmd和optparse为一组已经具有功能的类(CDContainer、CD等)开发CLI.py。下面是代码的一些部分。我这里有个问题。当出现异常(输入类型错误或缺少值)时,optpass将退出整个程序,而不是特定的命令方法python的optparse异常处理,python,command-line,exception-handling,Python,Command Line,Exception Handling,嗨,伙计们 我正在使用cmd和optparse为一组已经具有功能的类(CDContainer、CD等)开发CLI.py。下面是代码的一些部分。我这里有个问题。当出现异常(输入类型错误或缺少值)时,optpass将退出整个程序,而不是特定的命令方法 import cmd class CLI(cmd.Cmd): def do_addcd(self, line): args=line.split() parser = OptionParser()
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)
在“>python”下,如果我键入CLI.py,
然后我将有(Cmd),这样我就可以输入像“(Cmd)addcd-t3-nThriller”这样的命令。
但是如果我键入“addcd-tr-n3”,则optpasse将终止整个CLI.py并退出。
这对我不好。我想提醒用户每种方法,而不是终止整个程序
然而,OptPass文档称“整个程序退出”。所以我不能“盲目”使用optpass。我能做什么?这可能与您传递给CD类的类型有关:如果没有看到它,它很有可能会失败。在创建该对象并传递参数之前,最好先清理该数据,确保其类型正确,并执行您认为合理的任何其他检查。optparse文档说明: 如果optparse的默认错误处理行为不适合您的需要,则需要将OptionParser子类化并重写其exit()和/或error()方法 理想情况下,您应该定义一种新类型的异常,子类
optparse
,在您已重写的exit()
或error()
方法中引发异常,然后捕获它并根据需要处理它
不过,你可以作弊。如果希望打印错误消息,但不希望程序退出,则可以捕获SystemExit
异常,以捕获optpasse
试图退出并停止它的位置
例如:
try:
(options, positional_args) = parser.parse_args(args[0:])
except SystemExit:
return
cd_obj= CD()
cd_obj.addCD(options.track_number, options.cd_name)
或重写该方法:
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)
然后:
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)
自定义异常类仍然无法处理显示默认帮助上下文的“-h--help”选项
我所做的是在尝试之前使用sys.argv-除了block来处理帮助函数
if sys.argv[1] == '-h' or sys.argv[1] == '--help':
raise Exception('help')
parser = ModifiedOptionParser()
...
except Exception as value:
status = str(value)
if status is 'help':
parser.print_help()
return -1 # I need to set different return value
顺便说一下,谢谢你的提示。我明白了。我不使用optpass怎么办?我自己解析args并进行相应的分析。如你所说,如果我使用optpasse,我应该以某种方式覆盖它的exit或error方法,而我对此没有信心。我会坚持使用optpasse。它将保持选项解析行为的一致性,并且编写一个遵循正常约定的参数解析器将需要大量的工作。我用一个覆盖错误方法的例子更新了我的答案。嗨,Robie,非常感谢你用代码给出的详细答案!!!它符合我的意图!但有一件事,当我调用method-help,例如addcd-h时,它会列出选项,然后退出程序。也可以通过“帮助”来解决它吗。谢谢!嗨,Robie,有一件事,如果你在没有“-”的命令后随机键入,例如“addcd rffdsa”,那么optpass无法识别任何错误输入,程序也会崩溃。是否有可能捕获此类错误并返回。提前谢谢!
if sys.argv[1] == '-h' or sys.argv[1] == '--help':
raise Exception('help')
parser = ModifiedOptionParser()
...
except Exception as value:
status = str(value)
if status is 'help':
parser.print_help()
return -1 # I need to set different return value