尝试/排除和决策

时间:2015-01-14 10:01:09

标签: python python-2.7

我正在开发一个函数,它将不同种类的date_formats作为参数并将其分派给一个函数,该函数负责解析这种格式

换句话说:

def parse_format(date_format):
    # descision making happens here
     try:
         from_timestamp(date_format)
     except:
         pass

     try:
         from_dateformat(date_format)
     except:
         pass

def from_timestamp(format):
    # raise if not in charge

def from_dateformat(format):
    # raise if not in charge

def from_custom_format(format):
    # raise if not in charge

目前,parse_format有多个try / except块。这是要走的路,还是有更明显的方法呢?此外,我如何处理每个函数调用失败的情况?

2 个答案:

答案 0 :(得分:3)

我会做这样的事情:

class UnrecognizedFormatError(Exception):
    pass

def parse_format(date_format):
    methods = (from_timestamp, from_dateformat)
    for method in methods:
        try:
            return method(date_format)
        except:
            pass
    raise UnrecognizedFormatError

但也有一些关键点:

    没有特定异常的
  • except是错误的,因为可能会从意外的位置抛出异常,例如内存不足或脚本中的键盘中断。因此,请使用except SomeException as e表单,并使用特定的例外类型。
  • 如果每个函数都失败,此代码将抛出UnrecognizedFormatError,允许函数的用户做出适当的响应。

答案 1 :(得分:0)

好吧,我认为这是一个尝试/除了/ else / finally的好地方 - 否则会抓住每个函数调用失败的最后一个案例,并且最终'正在运行try / except语句中发生的任何事情。如果您的例外被适当选择,那么它将为您选择正确的功能。

另外,我猜这是一次学习练习,因为你在date.strftime()

更好地完成了你所描述的活动。
def from_timestamp(format):
    # raise if not in charge

def from_dateformat(format):
    # raise if not in charge

def from_custom_format(format):
    # raise if not in charge

def parse_format(date_format):
    # decision making happens here
    try:
         from_timestamp(date_format)
    except(FirstException):
          from_dateformat(date_format)
    except(SecondException):
         from_custom_format(date_format)
    else: 
        whatever_you_do_if_it_all_goes_wrong()
    finally: 
        thing_that_happens_regardless_of_what's_called()