
影刀RPA 错误码与异常类型读懂报错信息作者林焱什么情况用你的影刀RPA流程跑到一半突然停了弹出一大堆红色报错信息看着像天书一样不知道哪出了问题TypeError、KeyError、IndexError、AttributeError……这些到底是什么意思哪个环节出了错读懂报错信息是排查流程问题的第一技能。新手看到报错就慌老手看到报错信息就知道问题在哪。本文把影刀RPA中最常见的10种Python异常类型翻译成大白话配合RPA场景说明原因和解法。怎么做一、报错信息的三段结构一条完整的Python报错信息Traceback分三部分Traceback (most recent call last): ← 第1部分Traceback开头 File string, line 15, in module ← 第2部分出错位置文件、行号、函数 result data[price] * 2 ← 第3部分出错的代码行 KeyError: price ← 第4部分异常类型 错误描述排查步骤先看最后一行——异常类型和描述判断是什么错再看出错位置——第几行、哪个文件最后看出错代码——定位具体变量或操作二、十大常见异常类型详解1. TypeError——类型不对# 典型报错# TypeError: can only concatenate str (not int) to str# 原因字符串和数字不能直接用拼接msg价格128# 报错# 解决转成字符串msg价格str(128)msgf价格{128}RPA场景从网页采集的文本str和Excel读取的数字int/float做拼接时最常见。2. KeyError——字典key不存在拼多多店群自动化报活动上架# 典型报错# KeyError: price# 原因访问字典中不存在的keydata{name:商品A,stock:50}pricedata[price]# 报错没有price这个key# 解决用get()方法不存在时返回默认值pricedata.get(price)# Nonepricedata.get(price,0)# 0指定默认值# 或先检查key是否存在ifpriceindata:pricedata[price]else:price0RPA场景解析API返回的JSON数据时字段名和预期不一致。接口改版后字段名变了但代码没更新。3. IndexError——索引越界# 典型报错# IndexError: list index out of range# 原因访问列表中不存在的索引items[1,2,3]itemitems[5]# 报错列表只有3个元素最大索引是2# 解决先检查长度iflen(items)5:itemitems[5]else:itemNone# 或者用try-excepttry:itemitems[5]exceptIndexError:itemNoneRPA场景【获取元素列表】返回的列表为空直接取[0]时报错。网页改版导致元素没找到。4. AttributeError——属性/方法不存在# 典型报错# AttributeError: NoneType object has no attribute text# 原因对None调用方法elementNone# 元素没找到返回Nonetextelement.text# 报错# 解决先判空ifelementisnotNone:textelement.textelse:textRPA场景网页元素定位失败返回None后续对None操作就报这个错。这是影刀RPA中最高频的异常之一。5. ValueError——值不合法# 典型报错# ValueError: invalid literal for int() with base 10: abc# 原因把非数字字符串转成数字numint(abc)# 报错numint(12.5)# 报错有小数点numint()# 报错空字符串# 解决try-except 安全转换try:numint(float(12.5))# 先float再intexceptValueError:num0RPA场景从网页采集的价格文本包含特殊字符、空格、字母直接int()转换失败。6. FileNotFoundError——文件不存在# 典型报错# FileNotFoundError: [Errno 2] No such file or directory: data/config.json# 原因打开不存在的文件withopen(data/config.json,r)asf:# 报错contentf.read()# 解决先检查文件是否存在importos filepathdata/config.jsonifos.path.exists(filepath):withopen(filepath,r,encodingutf-8)asf:contentf.read()else:print(f文件不存在{filepath})content{}RPA场景配置文件路径写错、文件被移动或删除、工作目录不对。7. JSONDecodeError——JSON解析失败# 典型报错# json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)# 原因把非JSON格式的文本当JSON解析importjson datajson.loads(not json)# 报错datajson.loads()# 报错空字符串datajson.loads(html.../html)# 报错HTML不是JSON# 解决先检查再解析raw_textresponse.texttry:datajson.loads(raw_text)exceptjson.JSONDecodeError:print(fJSON解析失败原始内容前100字{raw_text[:100]})data{}RPA场景API返回了HTML错误页面而不是JSON数据或者接口返回了空响应。8. ConnectionError——网络连接失败# 典型报错# ConnectionError: HTTPSConnectionPool: Max retries exceeded# 原因网络不通、服务器拒绝连接、DNS解析失败importrequeststry:responserequests.get(https://example.com,timeout30)exceptrequests.ConnectionError:print(网络连接失败检查网络或URL)exceptrequests.Timeout:print(请求超时)exceptrequests.RequestExceptionase:print(f请求异常{e})RPA场景网络波动、目标网站宕机、防火墙拦截、URL写错。9. UnicodeDecodeError——编码错误# 典型报错# UnicodeDecodeError: utf-8 codec cant decode byte 0xff in position 0# 原因用错误的编码打开文件withopen(data.txt,r,encodingutf-8)asf:# 文件实际是GBK编码contentf.read()# 报错# 解决尝试多种编码defread_file(filepath):encodings[utf-8,gbk,gb2312,utf-8-sig,latin-1]forencinencodings:try:withopen(filepath,r,encodingenc)asf:returnf.read()exceptUnicodeDecodeError:continue# 所有编码都失败用errorsignore强制读取withopen(filepath,r,encodingutf-8,errorsignore)asf:returnf.read()contentread_file(data.txt)RPA场景读取Windows系统创建的文件通常是GBK编码用UTF-8打开就报错。10. ZeroDivisionError——除以零# 典型报错# ZeroDivisionError: division by zero# 原因除数为0total100count0averagetotal/count# 报错# 解决先检查除数ifcount0:averagetotal/countelse:average0RPA场景计算平均值、百分比时分母数据为0如采集到0条数据时算平均价格。三、异常处理标准模板defsafe_scrape(url):带完整异常处理的采集函数importrequestsimportjsontry:responserequests.get(url,timeout30)response.raise_for_status()# 检查HTTP状态码exceptrequests.Timeout:return{success:False,error:请求超时,type:Timeout}exceptrequests.ConnectionError:return{success:False,error:连接失败,type:ConnectionError}exceptrequests.HTTPErrorase:return{success:False,error:fHTTP错误{e},type:HTTPError}exceptrequests.RequestExceptionase:return{success:False,error:f请求异常{e},type:RequestException}try:dataresponse.json()exceptjson.JSONDecodeError:return{success:False,error:响应不是有效JSON,type:JSONDecodeError}try:result[]foritemindata.get(items,[]):result.append({name:item[name],# 可能KeyErrorprice:float(item.get(price,0)),# 可能ValueError})exceptKeyErrorase:return{success:False,error:f缺少字段{e},type:KeyError}except(ValueError,TypeError)ase:return{success:False,error:f数据转换错误{e},type:ValueError}return{success:True,data:result,count:len(result)}四、影刀RPA中的异常处理在影刀中用【尝试-异常】指令包裹可能出错的操作【尝试】 ├── 【获取元素文本】→ 变量 element_text ├── 【设置变量】price int(float(element_text)) ├── 【输出调试信息】价格 str(price) 【异常】  ├── 【设置变量】price 0 ├── 【输出调试信息】价格解析失败使用默认值0有什么坑TEMU店群矩阵自动化运营核价报活动坑1只捕获Exception不区分类型现象except Exception: pass把所有异常都吞了流程不报错但数据全错了。原因笼统捕获Exception会掩盖真正的bug连编码错误、类型错误都被忽略。解决捕获具体的异常类型至少要记录日志。except Exception as e: print(f异常{e})比pass好一百倍。坑2报错信息只看最后一行现象报错信息很长只看了最后一行KeyError: price但找不到是哪行代码出的错。原因Traceback有多层调用栈最后一行只是异常类型真正的出错位置在中间的行号信息里。解决从下往上读Traceback——最后一行是异常类型往上找第一个File string就是你的代码出错位置。在影刀中看Python代码块的行号对应关系。坑3嵌套try-except导致异常被覆盖现象外层try-except捕获到的异常信息和实际问题对不上。原因内层try-except捕获了异常A处理时又抛出了异常B外层捕获到的是异常B。解决内层异常处理要么完全处理掉不让外层看到要么用raise重新抛出原始异常raise或raise CustomError(...) from e。坑4影刀的【尝试-异常】不捕获Python代码块内的异常现象在Python代码块中发生了异常但影刀的【尝试-异常】指令没有捕获到。原因影刀的【尝试-异常】指令和Python的try-except不完全等价。Python代码块内部的异常可能被代码块自身处理了或者异常类型不被影刀的异常处理机制识别。解决在Python代码块内部用Python的try-except处理异常把结果通过yd_var传回。不要依赖影刀的【尝试-异常】来捕获Python代码块内部的异常。坑5忽略异常的链式信息现象raise ValueError(数据格式错误) from e中的from e被忽略丢失了原始异常信息。原因from e用于保留异常链——新异常是由哪个原始异常引起的。去掉from e会丢失这个因果关系。解决重新抛出异常时加上from eraise ValueError(数据格式错误) from e。这样Traceback会显示完整的异常链更容易排查。