1

カスタム例外でオブジェクトを渡す正しい方法は何ですか? このコードは以前は機能していたと確信していますが、現在はエラーがスローされています。

class FailedPostException(Exception):
    pass

def post_request(request):
    session = requests.Session()
    response = session.send(request.prepare(), timeout=5, verify=True)

    if response.status_code is not requests.codes.ok:
        raise FailedPostException(response)

    session.close()
    return response

try:
    ...
except FailedPostException as r:
    // type(r) - Requests.Response
    print r.text

AttributeError: 'FailedPostException' object has no attribute 'text'
4

3 に答える 3

6

例外の発生とキャッチは正しいです。ここでの問題は、text存在しない属性が例外にあると予想されることです。組み込みの例外タイプから継承する場合、args属性を使用できます。これは、例外への引数のタプルになります。次に例を示します。

try:
    ...
except FailedPostException as r:
    print r.args[0]

この場合、str(r)代わりにr.args[0]. 例外への引数が 1 つしかない場合str(r)は と同等になりstr(r.args[0])、それ以外の場合は と同等になりstr(r.args)ます。

text属性をに追加する場合FailedPostExceptionは、次の操作を実行できます。

class FailedPostException(Exception):
    def __init__(self, text, *args):
        super(FailedPostException, self).__init__(text, *args)
        self.text = text

Python 3.x では、super().__init__(text, *args).

于 2013-05-09T16:21:48.603 に答える
2

元のオブジェクトへの参照を保持し、次のResponseようにその属性を公開できます。

class FailedPostException(Exception):
    def __init__(self, rsp):
        super(FailedPostException, self).__init__()
        self.response = rsp
    @property
    def text(self):
        return self.response.text
    @property
    def status_code(self):
        return self.response.status_code
    #other properties if interested....

Responseオブジェクトをさらにイントロスペクトする必要がある場合

r.response.url
r.response.reason
...
于 2013-05-09T16:32:12.217 に答える
1

例外は、別のタイプのオブジェクトです。

class FailedPostException(Exception):
    def __init__(self, text):
        Exception.__init__(self, text)
        self.text = text

これにより、応答が次のように利用できるようになります.text

于 2013-05-09T16:19:28.690 に答える