Python try-except捕获异常发Slack通知遇JSON序列化错误求助
修复异常信息无法JSON序列化的问题
你遇到的TypeError是因为捕获到的MailboxLoginError异常对象无法被json.dumps()直接序列化——JSON只能处理字符串、数字、列表、字典等基础类型,不能直接序列化自定义类实例。
解决方案1:将异常转为字符串描述
直接用str(e)提取异常的文本描述,替换原代码中的slack_message赋值语句:
import json import urllib3 from imap_tools import MailBox try: with MailBox('imap.gmail.com').login(username, password) as mailbox: print(mailbox) except Exception as e: print(e) # 把异常对象转为可序列化的字符串 slack_message = {'text': str(e)} http = urllib3.PoolManager() response = http.request('POST', slack_webhook_url, body=json.dumps(slack_message), headers={'Content-Type': 'application/json'}, retries=False)
解决方案2:发送完整异常栈信息(便于排查)
如果需要更详细的错误上下文,比如调用栈,可以用traceback模块获取完整异常信息:
import json import urllib3 import traceback from imap_tools import MailBox try: with MailBox('imap.gmail.com').login(username, password) as mailbox: print(mailbox) except Exception as e: print(e) # 获取包含调用栈的完整异常信息 error_details = traceback.format_exc() # 用代码块格式展示异常栈,Slack会自动格式化 slack_message = {'text': f"系统发生异常:\n```\n{error_details}\n```"} http = urllib3.PoolManager() response = http.request('POST', slack_webhook_url, body=json.dumps(slack_message), headers={'Content-Type': 'application/json'}, retries=False)
这样修改后,slack_message中的text字段是字符串类型,就能正常被JSON序列化并发送到Slack了。
内容的提问来源于stack exchange,提问作者Mr. Annonymous
相关产品推荐
相关产品推荐

