optparse的异常处理

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)