如何加快程序调试的速度

孤立问题

利用test_learn孤立出问题. 典型场景是一大段程序执行当中发现正则表达式匹配出错,此时最好是大原先的字符串复制出来,然后放在test_learn中,用不同的正则表达式调试,调试成功了就可以用了.

循环内的问题

典型场景是循环了1000次,然后里面地745次执行会出问题. 如果此时设置断点的话,需要运行很久才才能发现问题. 可以采用加入判断语句的技巧来定位问题.参考下面的代码:

for i in range(1000):
    do_something(i) # i=745会报错
for i in range(1000):
    if i == 745:
       print(1) # 断点设置在这里
    do_something(i) 

网络环境中出现的问题

典型场景:网络环境中出现中断等问题,导致爬虫程序卡断,报错.print的记录不够详细.对这个情况应该记录最好要记录详细的日志,然后根据日志来查询问题. 记录日志采用.frm数据格式.其中把内容都保存下来,出现问题后打开查看其中的问题在哪里. 参考下面的案例:

for url_i in url_list:
    res = requests.get(headers=headers, url=url_i, timeout = 5) # 时不时会出问题
for url_i in url_list:
   begin_time = time.time()
   request_id += 1
    save_log(datetime.now(), {'headers': headers, 'url': url_i, 'reqeust_id ':reqeust_id }) #出问题这里会有日志记录.
    requests.get(headers=headers, url=url_i, timeout = 5) 
    save_log(datetime.now(), {'request_id ':request_id , 'time_cost': time.time()-begin_time, 'res': res}) # 这里有返回结果记录
# 另外写读取日志文件的函数
def read_log():
    log_frm = pd.read_pickle(log_file_path)
   problem_request_list = []
    for i in log_frm.index:
      # 这里可以改写为自己需要其他检查规则
       if time_cost in log_frm.loc[i,'detail'].keys() and log_frm.loc[i,'detail']['time_cost '] > 100
          problem_request_list.append( log_frm.loc[i,'detail']['request_id'])
    io_state.write(problem_request_list )

网络方面会发现很多预料之外的问题,因此原则上要建立详尽的日志系统.方便以后排查问题.

你可能感兴趣的:(如何加快程序调试的速度)