我试图找到我们的python脚本崩溃的原因.
主要结构是这样的:
def main()
try:
dostuff
except Exception as ex:
import traceback
tb = traceback.format_exc()
import platform
node = platform.node()
sendMail([DEBUG_EMAIL], "Alarm exception on %s" % node, str(tb), [])
Run Code Online (Sandbox Code Playgroud)
我在主要的错误处理中得到了这个堆栈跟踪,而不是我应该发送的错误电子邮件.
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/__init__.py", line 799, in emit
stream.write(fs % msg.encode("UTF-8"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
从我看到所有对logger的写入调用都在try-block中,但由于它没有在我的电子邮件发送异常块中捕获和处理,所以我似乎错过了一些东西.我已经检查过,sendMail函数根本不使用日志记录模块.所以异常不应该源于我的except-block.
我尝试添加
sys.tracebacklimit = 10
Run Code Online (Sandbox Code Playgroud)
在文件的顶部,查看异常发生的位置但不影响任何内容.而现在我已经没有关于如何找到问题所在的想法.
该脚本每小时运行一次,每周只崩溃一次,这使我认为它与输入数据有关,但这只能由dostuff()处理.
更新:
我已经弄清楚为什么我只得到一行堆栈跟踪.在emit()里面我发现了这个.
try:
... doing stuff, something goes boom with encoding...
except UnicodeError:
stream.write(fs % msg.encode("UTF-8")) Here it goes Boom again
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record) Which means it ends up here
Run Code Online (Sandbox Code Playgroud)
handleError函数的相关部分如下所示:
ei = sys.exc_info()
try:
traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
Run Code Online (Sandbox Code Playgroud)
其中只打印堆栈跟踪的最后一部分.
基本上你的问题是双重的
\n\n异常的具体原因是这样的:
\n\n>>> \'\xc3\xa4\'.encode(\'UTF-8\')\nTraceback (most recent call last):\n File "<stdin>", line 1, in <module>\nUnicodeDecodeError: \'ascii\' codec can\'t decode byte 0xc3 in position 0: ordinal not in range(128)\nRun Code Online (Sandbox Code Playgroud)\n\n但这个异常并不是真正的问题。这是2.6日志代码的一部分;799 是该块的最后一行。最后一行是导致问题的行。基本上,某些东西会以 8 位字节字符串记录消息,UTF-8 编码,包含 Latin-1 扩展字母;但流不喜欢这样,并在 try 块内抛出 UnicodeError ;
\n\ntry:\n if (isinstance(msg, unicode) and\n getattr(stream, \'encoding\', None)):\n\n # .... the string is NOT an unicode instance, so ignored\n # for brevity\n else:\n # this line throws the original exception \n # fs is a bytestring "%s\\n", and msg is a bytestring\n # with extended letters, most probably Latin 1.\n # stream.write spits out an UnicodeError on these values\n stream.write(fs % msg)\nexcept UnicodeError:\n # now we get a useless exception report from this code\n stream.write(fs % msg.encode("UTF-8"))\nRun Code Online (Sandbox Code Playgroud)\n\n因此,要调试它,您需要在上述第 799 行设置一个断点,并尝试所有记录器(如果它们接受以下字符串):
\n\nlogging.getLogger(name).critical(\'Testing logger: \xc3\xa4\')\nRun Code Online (Sandbox Code Playgroud)\n\n如果你到达第 799 行,然后获取异常的回溯,它可以揭示正在发生的事情......
\n| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |