0

私はこれのような階層と同様のコードを手に入れました:

class FrontendException:
    pass    
class BackendException:
    pass
class BackendRequest:
    def exec():
        raise BackendException()

class Frontend:
    def cmd_a():
        BackendRequest().exec()

    def cmd_b():
        BackendRequest().exec()

目標は、開発者がのFrontend関数内のオブジェクトと例外を操作できるようにすることcmd_xですFrontend

基本的に、私は一般的なBackendExceptionタイプを処理する場所が必要FrontendExceptionです。例えば:

class Frontend:
    def cmd_a():
        try:
            BackendRequest().exec()
        except BackendException as e:
            raise FrontendException()

そして、これは各機能で繰り返されcmd_xます!とても醜いです!そしてそれはBackend物事で動作します!繰り返される例外処理を削除したい。 助言がありますか?

ところで、私の解決策ですが、私もそれが醜いと思うので、あなたが私に何かを提案しようとした後にそれを見てください。多分あなたは私の解決策について私に何かを提案するでしょう。

class BaseFrontend:
    def exec_request(req):
        try:
            return req.exec()
        except BackendException as e:
            raise FrontendException
class Frontend(BaseFrontend):
    def cmd_a():
        result self.exec_request(BackendRequest())
    def cmd_b():
        result self.exec_request(BackendRequest())

編集:わかりました、はい、私は知っています、私は単純なAPIを構築するために多くのクラスを作成する必要はありません。しかし、結果に必要なものを見てみましょう。

class APIManager:
    def cmd_a(): ...
    def cmd_b(): ...

このマネージャーは、各コマンドを実行するためにHTTPRESTサービスにアクセスする必要があります。したがって、RESTリクエスト中にエラーが発生した場合は、例外APIManagerExceptionを発生させる必要があります-APIManagerユーザーが何であるかを知らないため、終了できません。の引数。だから私はいくつかの一般的なケースのために有益な例外を提起する必要があります。それをただ1つの例外としましょう- 。しかし、私は各コ​​マンドで、各pycurlリクエストに対して毎回ブロックを繰り返したくありません。実際、 pycurlエラーを解析するのではなく、でいくつかのエラーを処理したいと思います。raw pycurl exceptionpycurlpycurl errorIDcmd_xAPIManagerExceptiontry...exceptcommands(functions cmd_x)

4

1 に答える 1

0

すべてのフロントエンド呼び出し、キャッチ、およびスローされた場合BackendExceptionsのレイズをラップするデコレータを作成できます。(しかし、正直なところ、なぜandがクラスであり、関数のセットではないのFrontendExceptionかは明らかではありません。) 以下を参照してください。FrontendBackend

class FrontendException:
    pass    
class BackendException:
    pass
class BackendRequest:
    def exec():
        raise BackendException()

class Frontend:

    def back_raiser(func):
        def wrapped(*args, **kwargs):
            try:
                func(*args, **kwargs)
            except BackendException:
                raise FrontendException
        return wrapped

    @back_raiser
    def cmd_a():
        BackendRequest().exec()

    @back_raiser
    def cmd_b():
        BackendRequest().exec()
于 2012-12-19T22:24:34.607 に答える