2011-10-07 80 views
0

日益复杂/压痕嵌套的try-S我有这样的代码:如何避免在Python

try: 
    request=parse_request 
except: 
    print "cannot parse your malformed request" 
    exit() 
else: 
    try: 
     fh=a_factory_function() 
    except: 
     print "cannot create object" 
    else: 
     if request['operation']=='search': 
      pass 
     elif request['operation']=='more_like_this': 
      pass 
     elif request['operation']=='list_files': 
      pass 
     elif request['operation']=='update': 
      pass 
     else: 
      print 'unsupported operation' 

在目前的形式,它具有压痕

  1. 两个层面解析请求
  2. 工厂函数生成一个对象来处理请求

我可以轻松地imagin这将会达到4个级别,并且对于我们的弱点推理而言过于复杂。是否有Pythonic的方式来压扁缩进,并使其“线性”?

回答

1

除非我错误地解释了代码,否则您正在使用try语句的else子句进行正常处理。实际上,你正在模拟带有异常的返回码错误处理。为什么不这样做?

try: 
    request=parse_request 
    fh=a_factory_function() 
except MalformedRequestError: 
    print "cannot parse your malformed request" 
    exit() 
except CreateObjectError: 
    print "cannot create object" 
    exit() 

if request['operation']=='search': 
    pass 
elif request['operation']=='more_like_this': 
    pass 
elif request['operation']=='list_files': 
    pass 
elif request['operation']=='update': 
    pass 
else: 
    print 'unsupported operation' 

这里有在计算器上的好answer by Blair Conrad这可以解释为什么您可能希望使用else条款。

0

在这种情况下,你叫exit()追赶上最高水平的异常后,这样你就可以这样来做:

try: 
    request=parse_request 
except: 
    print "cannot parse your malformed request" 
    exit() 
try: 
    # and so on 
0

保留功能/脚本,每次失败后(如你的第一次失败做的) - 那么你不需要缩进下面的代码,因为在失败后它不可能运行。

根据代码的位置,您想要raise您自己的自定义错误或return而不是退出。

try: 
    request=parse_request 
except: 
    print "cannot parse your malformed request" 
    exit() 
try: 
    fh=a_factory_function() 
except: 
    print "cannot create object" 
    exit() 
if request['operation']=='search': 
    pass 
elif request['operation']=='more_like_this': 
    pass 
elif request['operation']=='list_files': 
    pass 
elif request['operation']=='update': 
    pass 
else: 
    print 'unsupported operation' 
2

Errors should not pass silently。如果你问我,在这种情况下打印一条消息而不是引发异常就算“默默地”。

调用exit()更糟糕 - 无论何时调用函数,无论导入的库有多深,格式错误的请求都会终止程序。

的更Python替代打印的消息则忽略erorr,或调用exit(),就是为了让这段代码捕获的呼叫者异常并处理它。在这个函数中你不需要任何异常处理。

如果您需要区分分析错误和对象创建错误,请提出自定义ParseErrorObjectCreationError并让调用方处理。 正如其他答案所示,如果一个块以raise(或exit()return)结尾,则不需要在其后面加一个缩进的else块。

+0

似乎对我来说是最合理和pythonic。 – Glider