如何让操作Zendesk工单的Python for循环在报错后继续执行并跳过异常工单?
解决Python循环处理工单时跳过错误继续执行的问题
我明白你的需求——你希望脚本在处理单个工单出错时,只记录错误的工单ID,然后继续处理下一个,而不是直接终止整个脚本。问题出在你当前的异常处理范围太大,把整个循环都包裹进去了,所以一旦某个工单处理出错,就会触发except块,直接跳出循环。我们只需要把异常处理的粒度缩小到每一次工单处理上就行。
修改后的代码
from zenpy.lib.api_objects import CustomField from zenpy import Zenpy import csv, sys creds = { 'email' : 'xxxxxxxxxxx', 'token' : 'xxxxxxxxxxx', 'subdomain': 'xxxxxxxxxxx' } zenpy_client = Zenpy(**creds) arquivo = '/Users/IDS.csv' try: with open(arquivo, 'rt', encoding='utf8') as ficheiro: leitor = csv.reader(ficheiro) contador = 0 for linha in leitor: if contador != 0: ticket_id = linha[0] try: # 尝试处理当前工单的核心逻辑 ticket = zenpy_client.tickets(id=ticket_id) ticket.custom_fields.append(CustomField(id=1900002490207, value=linha[1])) zenpy_client.tickets.update(ticket) print(f'O Ticket = {ticket_id} Teve o Este Valor Inserido = {linha[1]}') except Exception as e: # 捕获处理工单时的所有异常,打印错误信息 print(f'Erro ao processar Ticket {ticket_id}: {str(e)}') # 明确跳过当前工单,继续下一个(不加continue也会自动进入下一次循环,加上更清晰) continue contador = contador + 1 except csv.Error as e: # 处理CSV文件本身的错误(比如格式问题),这类错误无法跳过,直接终止脚本并提示 line_num = leitor.line_num if 'leitor' in locals() else 'desconhecida' print(f'ficheiro {arquivo}, linha {line_num}: {e}') sys.exit(1)
关键修改说明
- 缩小异常处理范围:把
try-except从整个循环外面移到了循环内部,只包裹单个工单的处理逻辑。这样单个工单出错时,只会触发当前的except块,不会影响后续循环。 - 提取工单ID变量:把
linha[0]赋值给ticket_id,方便在异常块中快速定位出错的工单。 - 扩展异常捕获类型:用
Exception捕获所有可能的错误(包括Zenpy API调用失败、网络问题、无效工单ID等),确保不会因为未预见的错误终止脚本。如果知道Zenpy的具体异常类(比如ZenpyException),也可以替换成更精准的类型。 - 分离CSV文件错误处理:把CSV文件本身的错误(比如读取失败、格式错误)单独处理,这类错误无法通过跳过解决,所以直接终止脚本并给出明确提示。
这样修改后,脚本在处理每个工单时遇到任何错误,都会打印该工单ID和错误详情,然后自动跳过,继续处理下一个工单,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Manassés G.
相关产品推荐
相关产品推荐

