[英]Python exception not caught
我目前正在使用Python中的套接字和JSON,其中我有以下代碼:
class RCHandler(SocketServer.BaseRequestHandler):
def setup(self):
pass
def handle(self):
raw = self.request.recv(1024)
recv = raw.strip()
if not recv:
return
# do some logging
logging.debug("RECV: (%s)" % recv)
try:
data = json.loads(recv)
except:
logging.exception('JSON parse error: %s' % recv)
return
if recv == 'quit':
return
問題是,當我發送一個錯誤的JSON字符串,例如'{"method": "test"'
,異常似乎被捕獲,但我仍然得到以下回溯:
DEBUG: 20/09/2015 12:33:57 - RECV: ({"method": "test")
ERROR: 20/09/2015 12:33:57 - JSON parse error: {"method": "test"
Traceback (most recent call last):
File "./remoteControl.py", line 68, in handle
data = json.loads(recv)
File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting object: line 1 column 17 (char 16)
我在這里錯過了什么? 如果我抓住異常,我不應該得到回溯嗎? 我的服務器類擴展了ThreadingTCPServer,如果它與它有關。
當我運行另一個python腳本時:
#!/usr/bin/python
import json
import socket
d = '{"method": "test"'
try:
data = json.loads(d)
except:
print "fail"
它只打印“失敗”而沒有追溯。
您確實捕獲了異常,但是您通過使用Logger.exception
方法告訴logging
包含異常信息(包括回溯):
except:
logging.exception('JSON parse error: %s' % recv)
從方法文檔 :
在根記錄器上記錄級別為
ERROR
的消息。 參數被解釋為debug()
,除了沒有檢查任何傳遞的exc_info
。 始終將異常信息添加到日志記錄消息中 。 只應從異常處理程序調用此函數。
強調我的 。
另請參閱Formatter.formatException()
文檔 ; 這是在這里執行異常格式化的方法:
將指定的異常信息(由
sys.exc_info()
返回的標准異常元組)格式化為字符串。 此默認實現僅使用traceback.print_exception()
。 返回結果字符串。
和traceback.print_exception()
執行此操作:
打印異常信息,最多限制堆棧跟蹤條目從回溯到文件 。
如果您不希望包含異常,請使用logging.error()
代替:
except:
logging.error('JSON parse error: %s' % recv)
或提供自定義Formatter
子類 ,該子類在沒有回溯的情況下Formatter
異常信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.