如何从requests.exceptions.RequestException获取异常字符串

use*_*151 4 python flask python-requests

我有以下烧瓶代码:

from flask import Flask,request,jsonify
import requests
from werkzeug.exceptions import InternalServerError, NotFound
import sys
import json



app = Flask(__name__)
app.config['SECRET_KEY'] = "Secret!"

class InvalidUsage(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message
        rv['status_code'] = self.status_code
        return rv

@app.errorhandler(InvalidUsage)
def handle_invalid_usage(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

@app.route('/test',methods=["GET","POST"])
def test():
    url = "https://httpbin.org/status/404"
    try:
        response = requests.get(url)
        if response.status_code != 200:
            try:
                response.raise_for_status()
            except requests.exceptions.HTTPError:
                status = response.status_code
                print status
                raise InvalidUsage("An HTTP exception has been raised",status_code=status)
    except requests.exceptions.RequestException as e:
        print e

if __name__ == "__main__":
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何从 requests.exceptions.RequestException 对象 e 获取异常字符串(消息)和其他相关参数?

另外记录此类异常的最佳方法是什么。如果出现 HTTPError 异常,我有状态代码可供参考。

但是 requests.exceptions.RequestException 捕获所有请求异常。那么我如何区分它们以及除了使用打印语句之外记录它们的最佳方法是什么。

预先非常感谢您的任何答复。

aru*_*ska 5

RequestExceptionHTTPError是、ConnectionErrorTimeoutURLRequired和其他类的基类TooManyRedirects(整个列表可在requests 模块的GitHub 页面上找到)。似乎处理每个错误并打印相应信息的最佳方法是从更具体的错误开始处理,最后以最通用的错误(基类)结束。此StackOverflow 主题的评论对此进行了广泛的阐述。对于您的test()方法,这可能是:

@app.route('/test',methods=["GET","POST"])
def test():
    url = "https://httpbin.org/status/404"
    try:
        # some code...
    except requests.exceptions.ConnectionError as ece:
        print("Connection Error:", ece)
    except requests.exceptions.Timeout as et:
        print("Timeout Error:", et)
    except requests.exceptions.RequestException as e:
        print("Some Ambiguous Exception:", e)
Run Code Online (Sandbox Code Playgroud)

RequestException这样,您可以首先捕获从该类继承的更具体的错误。

并考虑打印语句的替代方案 - 我不确定这是否正是您的意思,但您可以使用Flask 中的标准 Python 日志记录日志记录模块本身(此处适用于 Python 3)登录到控制台或文件。

  • 我希望能够从每个异常对象中提取错误消息并将其传递给错误处理程序或打印语句。处理错误后如何提取错误消息? (3认同)