我试图将pyodbc异常记录到日志文件中,问题是,使用标准的python日志记录,代码产生了另一个与编码异常args中出现的一些未识别字符(看起来像Chines)有关的异常,异常堆栈跟踪:
异常:[23000] [Oracle] [ODBC] [Ora] ORA-00001:唯一约束 (REDWOOD.TITLE_PK)违反了ORA-06512:第53行ઊȯ诔㸸ੌȯઉઉȯ 㸸ੌȯ倗翸ᴘඇȯ杦翸ɘઊȯ텈ઉȯੌȯ倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘倘^ h
촼杧翸(1)(SQLExecDirectW)---记录错误---回溯(最近一次调用最后一次):文件“\ Transfer \ transfer \ transfer_records.py”,第123行,在transfer_record中 row.PUBSTAT,row.CITED)文件“\ Transfer \ transfer \ db_access.py”,第476行,在transfer_record中 self.cursor.execute(sql_block,params)
pyodbc.IntegrityError:('23000','[23000] [Oracle] [ODBC] [Ora] ORA-00001:唯一约束(REDWOOD.TITLE_PK) 违反\ nORA-06512:在线 53 \ n \ X00ઊȯ\ X00诔唱\ X00 \ X00㸸ੌȯ\ X00 \ X00 \ x00s \ X00 \ uec40ઉȯ\ X00 \ X00 \ uf600 \ X00 \ X00㸸ੌȯ\x00ꦓ倗翸\x00ᴘඇȯ\ X00㫏杦翸\x00ɘઊȯ \ x00的텈ઉȯ\ X00㸸ੌȯ\ X00糆倘翸\ X00 \ X00 \ X00 \ X01 \ X00!\ X00 \ X00 \ x00H \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00촼杧翸\ X00 (1)(SQLExecDirectW)')
在处理上述异常期间,发生了另一个异常:
Traceback(最近一次调用最后一次):文件 “C:\ Python \ lib \ logging__init __。py”,第994行,在emit中 stream.write(msg)文件“C:\ Python \ lib \ encodings \ cp1252.py”,第19行,编码 return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError:'charmap'编解码器无法对字符进行编码 位置167-168:字符映射到调用堆栈:文件 “/Transfer/trans_ui.py”,第162行,in app.mainloop()文件“C:\ Python \ lib \ tkinter__init __。py”,第1277行,在mainloop中 self.tk.mainloop(n)文件“C:\ Python \ lib \ tkinter__init __。py”,第1699行,调用 return self.func(* args)file“/Transfer/trans_ui.py”,第130行,在transfer_records中 start_transfer.main(options = options,app = self)文件“\ Transfer \ start_transfer.py”,第19行,主要 transfer.start()文件“Transfer \ transfer \ transfer_records.py”,第46行,开头 list(map(self.transfer_record,self.transfer_rows))文件“Transfer \ transfer \ transfer_records.py”,第145行,在transfer_record中 logging.error(“Exception details:”+ ex.args [1])消息:'异常详细信息:[23000] [Oracle] [ODBC] [Ora] ORA-00001:唯一 约束(THOTH.TITLE_PK)违反了\ nORA-06512:在线 53 \ n \ X00ઊȯ\ X00诔唱\ X00 \ X00㸸ੌȯ\ X00 \ X00 \ x00s \ X00 \ uec40ઉȯ\ X00 \ X00 \ uf600 \ X00 \ X00㸸ੌȯ\x00ꦓ倗翸\x00ᴘඇȯ\ X00㫏杦翸\x00ɘઊȯ \ x00的텈ઉȯ\ X00㸸ੌȯ\ X00糆倘翸\ X00 \ X00 \ X00 \ X01 \ X00!\ X00 \ X00 \ x00H \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00촼杧翸\ X00 (1)(SQLExecDirectW)'参数:()总时间:24.116901397705078
处理完成,退出代码为0
产生异常的异常处理程序:
except pyodbc.Error as ex:
print("Exception: ", ex.args[1])
self.database.rollback()
self.records_counter['transfer_errors'] += 1
logging.error("Exception details: " + ex.args[1])
self.status_update("An Exception Occurred while transferring
record: " + row.CTRLNO + "-" + row.LEVL + " Details:" +
ex.args[1], msgbox='Error')
这些字符作为异常args的一部分出现了什么? 我怎么能摆脱它们,因为它们似乎正在产生编码异常
答案 0 :(得分:0)
您可以通过显式编码来摆脱它们,以便您可以使用 errors="replace"
或 ignore
结果字节不会很漂亮,但它们会被记录。
logging.error("Exception: " + str(ex.args[1].encode(encoding='charmap', errors='replace')))