Python 2.7:将所有异常保存到数据库中(转换为unicode问题)

时间:2018-02-02 11:33:20

标签: database python-2.7 unicode sqlite exception-handling

我正在尝试将python服务(在Windows 7/10上隐藏运行)抛出的所有异常保存到sqlite3数据库文件中。除了其他东西(追溯,日期等),我也想保存错误信息。

我的问题是有一些我无法转换为unicode的错误消息(尤其是一些WindowsErrors和带有德语'Umlaut'的错误:ä,ö,ü)。因为我事先并不知道每个可能的错误我希望有一个能够处理所有错误并将其消息转换为unicode 的函数。

有人能告诉我 convertToUnicode 功能必须是什么样的?

# -*- coding: utf-8 -*-

def someErrorneousFunction():
    raise RuntimeError('Not a unicode string. But with a german Umlaut: ä!')

def saveExceptionToDBThatOnlyAcceptsUnicode(msg):
    """SQL INSERT SOME STUFF... + THE UNICODE ERROR MESSAGE!"""
    pass

def convertToUnicode(e):
    """ What to do here ??? """
    pass

try:
    someErrorneousFunction()
except Exception as e:
    unicode_error_msg = convertToUnicode(e)
    saveExceptionToDBThatOnlyAcceptsUnicode(unicode_error_msg)

注意:我发现某些例外有一个名为 .msg .str 的属性,但不是全部属性!

这种方法有意义吗?我知道捕获所有异常没有区别的不好的做法,但因为我的软件偶尔会在其他地方的testmode中,我希望每个邮件都能得到异常数据库,这对我来说似乎很有意义。此外,我将我知道的错误与我事先不知道的错误区分开来。

我很感激任何建议!

谢谢!

塞巴斯蒂安

1 个答案:

答案 0 :(得分:1)

如果您的演示显示源文件已知为UTF-8,那么这应该可行:

# -*- coding: utf-8 -*-
import traceback

def someErrorneousFunction():
    raise RuntimeError('Not a unicode string. But with a german Umlaut: ä!')

def saveExceptionToDBThatOnlyAcceptsUnicode(msg):
    print type(msg)
    print msg

def convertToUnicode(e):
    return traceback.format_exc(e).decode('utf8')

try:
    someErrorneousFunction()
except Exception as e:
    unicode_error_msg = convertToUnicode(e)
    saveExceptionToDBThatOnlyAcceptsUnicode(unicode_error_msg)

输出:

<type 'unicode'>
Traceback (most recent call last):
  File "C:\test.py", line 15, in <module>
    someErrorneousFunction()
  File "C:\test.py", line 5, in someErrorneousFunction
    raise RuntimeError('Not a unicode string. But with a german Umlaut: ä!')
RuntimeError: Not a unicode string. But with a german Umlaut: ä!