Skip to main content
 首页 » 编程设计

python之如何优雅地捕获错误并保持方法清洁

2025年05月04日11sky-heaven

我正在编写一个小型(呃)Python 脚本来自动执行半频繁、耗时长且容易出错的任务。该脚本负责进行各种系统调用 - 通过 os.system 或通过 os.(mkdir|chdir|etc)。

这是我现在的代码示例:

class AClass: 
 
    def __init__(self, foo, bar, verbose=False, silent=False): 
        # Sets up variables needed for each instance, etc 
        self.redirect = '' 
        if silent: 
            self.redirect = '> 2>&1' 
        self.verbose = verbose 
 
    def a_method(self): 
        """ Responsible for running 4-6 things via system calls as described """ 
 
        if self.verbose and not self.silent: 
            print "Creating a directory" 
        try: 
            os.mkdir('foobar') 
        except OSError, e: 
            raise OSError, "Problem creating directory %s: %s" % (e.filename, e.strerror) 
 
        if self.verbose and not self.silent: 
            print "Listing a directory" 
        if (os.system('ls foobar %s') % self.redirect) is not 0: 
            raise OSError, "Could not list directory foobar" 
 
    def b_method(self): 
        """ Looks very similar to a_method() """ 
 
    def run(self): 
        """ Stitches everything together """ 
 
        try: 
            a_method() 
        except OSError, e: 
            print "a_method(): %s" % e.strerror 
            sys.exit(-1) 
 
        try: 
            b_method() 
        except OSError, e: 
            print "b_method(): %s" % e.strerror 
            sys.exit(-1) 

显然写所有的 if self.verbose and not self.silent 是困惑的,然后是 try/catch 或 if 围绕每个调用很难看。 我本来想使用 Python 的日志记录类,并且只需通过命令行配置一个日志记录级别(详细),然后我可以简单地调用 logger.debug('My message') 但我使用的是 Python 2.2而且我无权访问 logging 类。

总结/基本问题
我正在使用 Python 2.2,我无法更改它。我在 ESX 3.0.2 服务器上运行,暂时无法以任何其他方式访问它。
在不将此逻辑绑定(bind)到您的类(应该只做一件事)的情况下,处理错误检查和详细输出的最佳方法是什么?
我怎样才能用看起来更简单或更优雅的东西来减少困惑?

谢谢!

请您参考如下方法:

writing all the if verbose and not silent is messy 

因此,如果您需要简洁或沉默,则将 sys.stdout 分配给一个虚拟类,该类的写入是空操作,然后只需使用 print 而无需守卫。 (请记住将 sys.stdout 恢复为真实的打印件,而不是这样的条件——实际上更容易封装在几个函数中)。

对于错误检查,所有 block 都像:

    try: 
        a_method() 
    except OSError, e: 
        print "a_method(): %s" % e.strerror 
        sys.exit(-1) 

可以而且应该像

    docall(a_method) 

我希望这是一个非常明显的def docall(acallable):。

类似地,其他 try/except 情况和有条件地引发新异常的情况可以成为对具有适当参数的函数的调用(包括可调用对象,即高阶函数)。如果您澄清其中的哪些部分对您来说很难或不清楚,我很乐意添加详细的代码!

Python 2.2,虽然现在已经很老了,但就其本身而言是一门很棒的语言,您可以随心所欲地巧妙地使用它,就像其他伟大的古老语言(例如 MacLisp)一样;- ).