Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python的optparse异常处理_Python_Command Line_Exception Handling - Fatal编程技术网

python的optparse异常处理

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()

嗨,伙计们

我正在使用cmd和optparse为一组已经具有功能的类(CDContainer、CD等)开发CLI.py。下面是代码的一些部分。我这里有个问题。当出现异常(输入类型错误或缺少值)时,optpass将退出整个程序,而不是特定的命令方法

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