我使用以下代码按日期排序字典列表:
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个元素......
答案 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