2

Web サーバーを介した RPC 呼び出しのディスパッチャに取り組んでいます。webserver クラスには、rpc_echo、rpc_add など (接頭辞 rpc_ が付く) のような、リモートからアクセスできるメソッドがいくつかあります。ディスパッチャー メソッドでは、対応するメソッドを見つけて、辞書に準備された引数を指定して呼び出すことができます。

try:
  handler = getattr(self, 'rpc_' + request['method'])  # identify handler
  response['result'] = handler(**params)  # assign arguments and call handler
except (AttributeError, KeyError):
  # exceptions: requested method -> key, call method -> attr, callable -> attr
  raise JSONRPCError('unknown method.')
except TypeError:
  raise JSONRPCError('parameters don\'t match method prototype.')

これは正常に動作しています。ただし、ハンドラー内で例外がスローされると、エラー チェックが妨げられ、間違った結論につながります。例外がハンドラー内でスローされたかどうかを確認するにはどうすればよいですか? したがって、間違った呼び出しまたはサーバー エラーですか?

4

2 に答える 2

2

おそらくtraceback モジュールで時間を費やしたいでしょう

簡単な例を次に示します。

import sys, traceback

def outer(b):
    def inner(b):
        return [0,2,99][b]
    return "abcd"[inner(b)]

# "abcd"[[0,2,99][1]] => "abcd"[2] => "c"
print(outer(1))

try:
    # "abcd"[[0,2,99][2]] => "abcd"[99] => IndexError
    print(outer(2))
except IndexError:
    fname = traceback.extract_tb(sys.exc_info()[2])[-1][2]
    print("Exception from: {}".format(fname))

try:
    # "abcd"[[0,2,99][3]] => IndexError
    print(outer(3))
except IndexError:
    fname = traceback.extract_tb(sys.exc_info()[2])[-1][2]
    print("Exception from: {}".format(fname))

出力:

c
Exception from: outer
Exception from: inner
于 2012-10-25T18:02:13.717 に答える
0

ハンドラー呼び出しをその try/except ブロックから取り出して、別のブロックに入れるだけです。

try:
  handler = getattr(self, 'rpc_' + request['method'])  # identify handler      
except (AttributeError, KeyError):
  # exceptions: requested method -> key, call method -> attr, callable -> attr
  raise JSONRPCError('unknown method.')
except TypeError:
  raise JSONRPCError('parameters don\'t match method prototype.')

try:
    response['result'] = handler(**params)  # assign arguments and call handler
except Exception:
    handle_exceptions
于 2012-10-25T14:54:33.097 に答える