源于一行log:[2018-08-24 10:28:07,042: ERROR/MainProcess] 541137549407: update table error: TypeError: tuple indices must be integers, not str。
看到这行log... 几乎没有办法debug。
def update_product(self, item_id, product_data, where, is_zk_coupon, table_name="coupon_product_v2", update_source_id=False):
"""
更新coupon_product_v2, 发送消息
:param data_dict:
:param is_zk_coupon:
:param table_name: 更新数据表
:return: None/coupon_id
"""
print(json.dumps(product_data), '=' * 20)
try:
update_coupon_data = self.get_should_update_product_info(item_id, product_data, is_zk_coupon, update_source_id=update_source_id)
if not update_coupon_data:
self.logger.info('item id : {} can not get prod info, maybe start fee or price stuff,raw prod info is {}'.format(item_id, product_data))
return
self.ignore_admin_columns(item_id, product_data)
self.db_write.update(update_coupon_data, where, table_name)
except Exception as e:
self.logger.error("{} update table error: {}".format(item_id, e))
return
else:
errorcount.product_update()
self.logger.info("{} update product success:{}".format(item_id, update_coupon_data))
tmp_info = self.db_read.select(["coupon_id"], where="item_id={}".format(item_id), table="coupon_product_v2",
result_type='dict')[0]
coupon_id = tmp_info["coupon_id"]
# 发送消息
# self.send_publish('update_cache', 'product', 'u', [coupon_id], data={coupon_id: update_coupon_data})
DbAcTracker().send_msg('product', 'u', [coupon_id], data={coupon_id: update_coupon_data})
return coupon_id
- 在一个try里做了过多逻辑。捕获异常进行了 失败记录,后面的逻辑不清楚具体失败的原因。
- log 使用了error,但是没有使用exception,使得没有错误堆栈被打印出来。
- exception的error 没有定义清楚 到底属于哪个异常。捕获了所有异常,使得一些bug被隐藏。并且异常没有被处理。
第一步 :去掉 包罗万象的try
[2018-08-24 10:28:07,119: ERROR/ForkPoolWorker-2] Task zion_task_savedb[4ea693cf-07ec-41e5-b3c5-c30d0004b0cd] raised unexpected: TypeError('tuple indices must be integers, not str',)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/celery/app/trace.py", line 367, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/celery/app/trace.py", line 622, in __protected_call__
return self.run(*args, **kwargs)
File "/root/wwwroot/Zion/tasks/base_zion.py", line 33, in wrapper
res = func(self, result_info, *args, **kwargs)
File "/root/wwwroot/Zion/tasks/task_savedb.py", line 294, in run
coupon_id = self.store_coupon_product(coupon_row, item_value, item_id, item_info['raw_price'])
File "/root/wwwroot/Zion/tasks/task_savedb.py", line 701, in store_coupon_product
self.update_product(item_id, item_value, "item_id={}".format(item_id), False, update_source_id=True)
File "/root/wwwroot/Zion/tasks/common/update_base.py", line 623, in update_product
self.ignore_admin_columns(item_id, product_data)
File "/root/wwwroot/Zion/tasks/common/update_base.py", line 604, in ignore_admin_columns
if rows and (rows[0]['intv2'] >= 5 or rows[0]['improve'] or rows[0]['is_recommend'] or rows[0]['is_prior']):
TypeError: tuple indices must be integers, not str
看到熟悉的报错,顿时心里就有种莫名的熟悉
好的,经过一番斗(单)智(步)斗(调)勇(试)。原来是[图片上传失败...(image-6f65df-1544761802427)]
第二步:分析一下 需要被捕获的异常。
由于这里面的逻辑,并没有已知且正常的异常需要被处理。所以 就直接把try exception去掉了。
知道导致异常的原因,再去捕获特定的异常。
捕获异常的时候,只try 可能出现异常的代码。
需要考虑 异常是否需要被当即处理,还是需要被抛出。
总而言之,言而总之。就是 明白你要捕获的异常是什么再去捕获。捕获异常其实只是打一条log的话,意味着直接忽略异常,那需要考虑的可能就是 这个异常是否应该被忽略。不应该忽略的异常应该被及时的处理。
还有,有数据写入操作但是不打log的都是耍流氓呢
网友评论