1. 程式人生 > >Thrift python常見錯誤分析

Thrift python常見錯誤分析

使用Thrift經常碰到錯誤提示“No handlers could be found for logger "thrift.server.TServer"”,這句話其實很坑人,尤其是使用thrift的新手。因為,看到這句話也許會認為,應該是自己編寫的server程式框架有問題。也就是如下部分:

<span style="font-size:12px;">handler = XXFilterSpamTextServiceHandler()
processor = XXFilterSpamTextService.Processor(handler)
transport = TSocket.TServerSocket(port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

print "starting serve"
server.serve()
print "done!"</span>
當然,有在這部分出錯的,也有在其他地方出錯的。下面我們詳細分析。

一.程式框架出錯

此類錯誤易犯人群:小白、程式剛剛寫完第一次除錯階段。這個錯誤解法相當簡單。比照模版看看出錯在那裡,官網模版地址http://thrift.apache.org/tutorial/py。server程式程式碼如下:

import sys, glob
sys.path.append('gen-py')
sys.path.insert(0, glob.glob('../../lib/py/build/lib.*')[0])

from tutorial import Calculator
from tutorial.ttypes import *

from shared.ttypes import SharedStruct

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

class CalculatorHandler:
  def __init__(self):
    self.log = {}

  def ping(self):
    print 'ping()'

  def add(self, n1, n2):
    print 'add(%d,%d)' % (n1, n2)
    return n1+n2

  def calculate(self, logid, work):
    print 'calculate(%d, %r)' % (logid, work)

    if work.op == Operation.ADD:
      val = work.num1 + work.num2
    elif work.op == Operation.SUBTRACT:
      val = work.num1 - work.num2
    elif work.op == Operation.MULTIPLY:
      val = work.num1 * work.num2
    elif work.op == Operation.DIVIDE:
      if work.num2 == 0:
        x = InvalidOperation()
        x.what = work.op
        x.why = 'Cannot divide by 0'
        raise x
      val = work.num1 / work.num2
    else:
      x = InvalidOperation()
      x.what = work.op
      x.why = 'Invalid operation'
      raise x

    log = SharedStruct()
    log.key = logid
    log.value = '%d' % (val)
    self.log[logid] = log

    return val

  def getStruct(self, key):
    print 'getStruct(%d)' % (key)
    return self.log[key]

  def zip(self):
    print 'zip()'

handler = CalculatorHandler()
processor = Calculator.Processor(handler)
transport = TSocket.TServerSocket(port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

# You could do one of these for a multithreaded server
#server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
#server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)

print 'Starting the server...'
server.serve()
print 'done.'
接下來,我們需要說的是:CalculatorHandler,這個類名需要根據實際情況構造,比如這裡他們的名字thrift中的服務類的名字Calculator,然後加上一個Handler就可以構造為服務類了,這種類我們統稱為Handler類。

二.編寫的Handler類中小錯誤

thrift框架做的很好,封裝的也很好,不僅僅有程式碼生成功能,而且還有錯誤處理機制。這種錯誤處理機制處理過程是:當Handler類中的出現錯誤時,一律提示:“No handlers could be found for logger "thrift.server.TServer"”。換句話說,當變數拼寫錯誤時,不會提示某個變數未命名,而提示“No handlers could be found for logger "thrift.server.TServer"”,這樣無疑增加了改錯難度,坑啊!!!
對於此,比較好的解決方案是:使用try....except  Exception as e:模組來手動列印錯誤。try模組程式碼示例如下:
try:
    a=b
except Exception as  e:
    print e
這樣出錯時候,就會報出哪裡出錯了!!!!

相關推薦

Thrift python常見錯誤分析

使用Thrift經常碰到錯誤提示“No handlers could be found for logger "thrift.server.TServer"”,這句話其實很坑人,尤其是使用thrift的新手。因為,看到這句話也許會認為,應該是自己編寫的server程式框架有

python常見錯誤類型

nco ans 模塊 垃圾回收機制 不同類 tab 叠代器 範圍 常見 Python標準異常總結AssertionError 斷言語句(assert)失敗 AttributeError 嘗試訪問未知的對象屬性 EOFError 用戶輸入文件末尾標誌EOF(Ctrl+d) F

Python常見錯誤:IndexError: list index out of range

spa bsp lis 遍歷字典 pan nbsp exe 字典 dex 用python寫腳本查詢字典時,在遍歷字典時循環到某一項時老是報錯 出現這種錯誤有兩種情況: 第1種可能情況 list[index]index超出範圍 第2種可能情況 list是空值就會出現 In

python常見錯誤總結,持續更新

1、錯誤:NameError: name 'raw_input' is not defined 原因:原因出在raw_input ,python3.0版本後用input替換了raw_input 2、 在Python 3.x 裡面,iteritems()方法已經廢除了。在3.x裡用 ite

python常見錯誤(持續更新)

1.matplotlib畫圖報錯AttributeError: ‘module’ object has no attribute ‘popall’ 解決方法如下: 原版本1.2.0升級成2.0.2 rpm -e python-matplotlib-1.2.0-15.el7.x86_6

svn 常見錯誤分析

這時可能會出現系統提示,因為subversion發現了local work copy和repository上的不一致。需要svn使用者自己裁決,可以直接輸入tf,即使用repository上版本即可,因為你沒有更改project檔案。即:Conflict discovered in ‘EuM1.xcodep

常見錯誤分析及解決方法

Such as :compile block ----Con_appError:make[1]: *** No rule to make target `Hai_Extern.obj', needed by `build/GXQ26_07B/gprs/MT6226o/lib/conn_app.lib'.  S

python常見錯誤歸理

1)eclipse主應用程式不能夠改名字,工程名檔名埠不能共享。 2)模組安裝:  如果採用原始碼安裝方法,有可能會提示缺少setuptools這個模組。另外一種更為方便的安裝方法,不論你選擇哪種安裝

tslib交叉編譯常見錯誤分析

Segmentation fault ts.conf沒修改,或者修改後前邊的空格沒有刪除掉 vi /opt/ts.conf 最後內容如下: module_raw input module pthres pmin=1 module variance delta=30 module dejit

Hibernate常見錯誤分析(一)

錯誤分析 錯誤1 錯誤2 所以在一個持久化類中必須有一個預設的建構函式 錯誤3 在對映檔案中,主鍵的生成機制用的是 但是表卻不支援,所以會報這樣的錯誤 錯誤

python常見錯誤型別

Python標準異常總結 AssertionError 斷言語句(assert)失敗 AttributeError 嘗試訪問未知的物件屬性 EOFError 使用者輸入檔案末尾標誌EO

GDAL在VS2015上編譯及常見錯誤分析

說實話,gdal在windows上的編譯真的讓人頭疼,它有各種版本的問題,以前用vs2010編譯過一次,這次又一次搞了好久。。。。因此記錄以來,常見的錯誤點。 1. 下載gdal-2.03並解壓

Java類載入時常見錯誤分析

    在執行Java程式的時候常常都會遇到ClassNotFoundException和NoClassDefFoundError這兩個錯誤,它們都和類載入異常有關。    ClassNotFoundException    這個異常常常發生在顯式載入一個類的時候,通常有以下

python 常見錯誤類型 和 繼承關系

code dex dede 運行時 繼承關系 one err 系統 type BaseException +-- SystemExit #系統結束 +-- KeyboardInterrupt #鍵盤中斷 ctrl+D +-- GeneratorExit #主動結

Mysql主從復制以及常見錯誤問題分析

ase min transacti 無法 bin ger datadir mysql主從 mysql配置 Mysql主從復制以及常見錯誤問題分析一、主從復制簡介:1、mysql

python常見易混淆的錯誤

index div clust abcdefg 混淆 har pan int style 1,關於break break是終止最近的循環。 1 for i in range(10): 2 if i == 2: 3 break 4

【Tomcat】JPS中常見的tomcat報錯錯誤分析

tomcat1:請求收到,繼續處理2:操作成功收到,分析、接受3:完成此請求必須進一步處理4:請求包含一個錯誤語法或不能完成5**:服務器執行一個完全有效請求失敗 100——客戶必須繼續發出請求101——客戶要求服務器根據請求轉換HTTP協議版本 200——交易成功201——提示知道新文件的URL202——接

Python新手入門學習常見錯誤

mouse his none 有時 循環 num class 函數名 assert 當初學 Python 時,想要弄懂 Python 的錯誤信息的含義可能有點復雜。這裏列出了常見的的一些讓你程序 crash 的運行時錯誤。 1)忘記在 if , elif , else ,

Python常見十六個錯誤集合,你知道那些?

學習 錯誤 程序員 使用python會出現各種各樣的錯誤,以下是Python常見的錯誤以及解決方法。 1.ValueError: ‘Conv2d_1a_3×3’ is not a valid scope name 這個是剛遇到的問題,在LZ自己手打Inception net的時候,想賦一個名字的時

Python模組匯入錯誤分析

分享最近有一次使用Python導模組時的錯誤: 1、問題產生 最近筆者在練習爬蟲的過程中,得知有一個模組叫做builtwith,其中有個parse的方法可以用來檢查網站構建的技術型別,於是直接用pip安裝了此模組: pip install builtwit