sort()by date抛出异常。哪个元素失败了?

时间:2014-02-07 18:03:09

标签: python sorting exception-handling

我使用以下代码按日期排序字典列表:

try:
    value["spotlight"].sort(key=lambda x: datetime.datetime.strptime(x["start"], "%Y%m%d-%H%M"), reverse=True)
except:
    logger.info("sort exception")
    exc_type, exc_obj, exc_tb = sys.exc_info()
    logger.info(exc_type)
    logger.info(exc_obj)
    logger.info(exc_tb.tb_lineno)

自二月开始以来,我开始看到这个例外:

<type 'exceptions.ValueError'> day is out of range for month

如何判断哪个字典失败,以便我可以调试?

PS - 列表大约有500个元素......

2 个答案:

答案 0 :(得分:5)

不要使用lambda作为键函数,而是编写一个完整的函数定义。让此函数捕获strptime中的异常并使用标识的日期字符串引发其自身的异常。

使用评论中的建议,在https://wiki.python.org/moin/HandlingExceptions

的指导下向现有例外对象添加信息
def start_key(x):
    d = None
    try:
        d = x["start"]
        return datetime.datetime.strptime(d, "%Y%m%d-%H%M")
    except Exception as e:
        if d:
            e.args += (d,)
        raise

value["spotlight"].sort(key=start_key, reverse=True)

答案 1 :(得分:0)

肯定是2013-02-29或类似的。

>>> datetime.datetime.strptime("20130132", "%Y%m%d")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 328, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains: 2
>>> 
>>> datetime.datetime.strptime("20130229", "%Y%m%d")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 447, in _strptime
    datetime_date(year, 1, 1).toordinal() + 1
ValueError: day is out of range for month