簡體   English   中英

沒有抓住Python異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM