使用thrift經常碰到錯誤提示「no handlers could be found for logger "thrift.server.tserver"」,這句話其實很坑人,尤其是使用thrift的新手。因為,看到這句話也許會認為,應該是自己編寫的server程式框架有問題。也就是如下部分:
handler = xxfilterspamtextservicehandler()
processor = xxfilterspamtextservice.processor(handler)
transport = tsocket.tserversocket(port=9090)
tfactory = ttransport.tbufferedtransportfactory()
pfactory = tbinaryprotocol.tbinaryprotocolfactory()
server = tserver.t******server(processor, transport, tfactory, pfactory)
print "starting serve"
server.serve()
print "done!"
當然,有在這部分出錯的,也有在其他地方出錯的。下面我們詳細分析。
此類錯誤易犯人群:小白、程式剛剛寫完第一次除錯階段。這個錯誤解法相當簡單。比照模版看看出錯在那裡,官網模版位址程式**如下:
import sys, glob
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.t******server(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類。
對於此,比較好的解決方案是:使用try....except exception as e:模組來手動列印錯誤。try模組**示例如下:
try:
a=bexcept exception as e:
print e
這樣出錯時候,就會報出**出錯了!!!! Fabric first sample常見錯誤
解決方案 清空容器 docker stop docker ps q docker rm docker ps aq 然後就變成新的問題2了 解決方案 這個問題產生的原因是之前產生的證書在docker裡面,沒有清乾淨 docker compose f docker compose cli.yaml do...
常見易錯問題
型別轉換 一 const cast 去除常量特性 二 static cast 普通型別轉換和類繼承的父指標到子類指標的轉換 引用一樣 注意 不能用於物件本身,只轉換不進行執行時型別檢查 不能進行的轉換 1 p int 2 aobj bobj 3 const non const 總的來說,沒有意義的轉...
常見錯誤和找錯方法
常見錯誤 總結 沒有效果就去找 排錯方式 1.根據知識點 2.根據業務邏輯來安排 2 1.明確瀏覽器解析的正確順序 1.標籤 2.css 3.js 2 2.頁面上啥也沒有,證明沒有標籤或者標籤位置寫錯 2 3.頁面上沒有樣式,證明選擇器沒有樣式 2 4.頁面上沒有動態互動,要麼沒有互動屬性,要麼互動...