You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tornado返回403响应时抛出错误的原因及信息获取方法

这个问题我之前折腾Tornado的时候也碰到过,正好给你理清楚来龙去脉和解决办法~

为什么Tornado会因403抛出错误?

Tornado 的 AsyncHTTPClient.fetch() 方法默认会把 4xx(客户端错误)和5xx(服务器错误) 这类状态码判定为请求失败,所以会直接抛出 tornado.httpclient.HTTPError 异常。这是它内置的错误处理逻辑,和 requests 库的设计思路不一样——requests 会把所有响应(包括错误状态码)都封装成 Response 对象返回,把是否处理错误的权力交给开发者自己。

如何从错误响应中获取更多信息?

有两种简单的方式可以拿到403响应的详细内容:

方法一:捕获HTTPError异常提取响应

你可以通过 try-except 块捕获这个异常,异常对象本身就包含了完整的响应信息,直接访问它的 response 属性就能拿到响应体、状态码等内容:

from tornado.httpclient import AsyncHTTPClient, HTTPError
import tornado.ioloop

async def fetch_url():
    client = AsyncHTTPClient()
    try:
        response = await client.fetch("https://example.com/403-page")
    except HTTPError as e:
        # 从异常中取出响应对象
        error_response = e.response
        print(f"状态码: {error_response.code}")
        print(f"403响应体内容: {error_response.body.decode('utf-8')}")
    else:
        print(f"正常响应内容: {response.body.decode('utf-8')}")

tornado.ioloop.IOLoop.current().run_sync(fetch_url)

方法二:关闭自动抛错,直接获取响应

如果不想处理异常,你可以在调用 fetch() 时传入 raise_error=False 参数,这样不管状态码是多少,Tornado 都会直接返回响应对象,和 requests 的行为完全一致:

from tornado.httpclient import AsyncHTTPClient
import tornado.ioloop

async def fetch_url():
    client = AsyncHTTPClient()
    response = await client.fetch("https://example.com/403-page", raise_error=False)
    print(f"状态码: {response.code}")
    if response.code == 403:
        print(f"403响应体内容: {response.body.decode('utf-8')}")
    else:
        print(f"正常响应内容: {response.body.decode('utf-8')}")

tornado.ioloop.IOLoop.current().run_sync(fetch_url)

内容的提问来源于stack exchange,提问作者mgcdanny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:23:50