2009-08-12 44 views
1

我在写一个小(ER)的Python脚本来自动半频繁,长,且容易出错的任务的过程。这个脚本是负责制定各种系统调用 - 无论是虽然使用os.system或通过操作系统。(MKDIR | CHDIR |等)。如何优雅地捕捉错误并保持方法的清洁?

这里是我的代码示例现在:

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/catchif是丑陋来看待。 我也喜欢使用Python的日志类,只是有一个日志记录级别(详细)通过命令行配置,然后我可以简单的调用logger.debug('My message')但我使用Python 2.2和我没有访问logging类。

摘要/基本问题
我正在使用Python 2.2,我无法更改此设置。我在ESX 3.0.2服务器上运行,暂时无法以其他方式触摸它。
什么是处理错误检查和详细输出没有这个逻辑绑到类(这应该只做一件事)的最好方法?
我怎样才能减少更多的东西简单或优雅看混乱?

谢谢!

+0

DRY原则:不要重复自己。 – 2009-08-12 04:13:37

回答

4
writing all the if verbose and not silent is messy 

所以,相反,分配sys.stdout的一个虚拟类,它的写操作是一个空操作,如果你需要unverbose或沉默,那么就使用打印,而不需要后卫。 (千万记住恢复sys.stdout的真实的东西,对于打印那些不那么空调 - 更容易在一对夫妇的功能封装,实际上)。

对于错误检查,所有像块:

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这样的其他伟大的旧语言一样使用它。 - )。

+0

谢谢。这清除了一切。 – 2009-08-12 14:00:04

4

如何清理您的详细输出

移动冗长/安静的逻辑成一个单一的功能,然后调用这个函数为所有的输出。如果你把它做得很好并且很短,它会让你的主线代码很整洁。

def P(s): 
    if (verbose): 
     print s 

我有一个包,这是否在我们的内部代码,它有以下方法:

  • P - 正常打印:P('this prints regardless, --quiet does not shut it up')
  • V - 详细打印:V('this only prints if --verbose')
  • D - debug print:D('this only prints if --debug')