Python Requests模块的异常处理

2025年1月5日 | 阅读 7 分钟

引言

在本教程中,我们将学习 Python Requests 模块的异常处理。Python Requests 是一个流行的库,用于在 Python 中发送 HTTP 请求。它提供了一种简单自然的方式来与网站和 API 进行交互。然而,与其他函数一样,在使用请求模块时正确处理异常非常重要。通过使用自定义处理,您可以礼貌地修复错误,防止程序崩溃或获利。本教程将介绍一些最佳实践,并探讨 Python 请求模块中异常处理的重要性。我们将使用 Python 的 try 和 except 函数来检测请求模块中发生的异常。

  • url: 返回响应的 URL。
  • raise_for_status(): 如果发生错误,则此方法返回一个 HTTPError 对象。
  • request: 返回请求此响应的请求对象。
  • status_code: 返回成功的状态码(200 表示正常,404 表示未找到)。

什么是异常?

Python 中的异常是运行时处理正则表达式的事件。当遇到异常时,程序必须失败并跳转到特殊处理块。您可以使用自定义处理来捕获和管理这些异常。请求模块在处理 HTTP 请求时会抛出一些异常。如果您了解这些异常,就可以修复更多错误。您可能会遇到以下异常:

1. ConnectionError

当无法访问服务器时,会发生此异常。这可能是由多种原因引起的,例如 DNS 解析问题或连接被拒绝。

2. TooManyRedirects

当请求返回的重定向次数超过允许次数时触发。当服务器将客户端重定向到另一个 URL 时会发生重定向。

3. Timeout

请求期间没有响应。这可能是由于服务器响应缓慢或网络问题造成的。

4. RequestException

默认异常类,特定于请求模块。它包括进行请求时可能发生的各种类型的异常。

5. HTTPError

针对 HTTP 响应错误(状态码 400 及以上)进行改进。这意味着服务器以错误代码响应。

程序代码

首先,我们需要通过发送请求来检查连接。代码如下:

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

200

程序代码

在这里,我们尝试解析 URL,然后使用 raise_for_status() 函数将其传递给 Python 请求模块。如果测试部分成功,我们将收到 200 的响应;如果页面我们请求的页面不可用,则会发生 HTTP 错误,由 Request 模块的 HTTPError 异常处理;您可能会收到 404 错误。代码如下:

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

Here occurs HTTP Error
404 Client Error: Not Found for url: https://www.google.com//hii
The response code is: <Response [404]>

程序代码

您可以使用请求模块中的自定义异常,即 requests.exceptions.RequestException。一般异常处理的程序代码如下:

输出

您可能会注意到,现在向请求模块传递了一个“timeout”参数。我们可以为连接请求的响应设置时间限制。现在,我们在 Python 中编译上述代码,并在成功编译后运行它。输出如下:

Exception request

程序代码

在上面的程序中,我们注意到现在向请求模块传递了一个“timeout”参数。我们可以为连接请求的响应设置时间限制。如果未发生这种情况,请求将捕获它。我们可以使用 requests.exceptions.ReadTimeout 异常。让我们找一个响应迅速的网站来证明这一点。

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

The response is:  <Response [200]>

如果我们更改 timeout = 0.01,那么相同的代码将返回,因为请求速度不会很快。

程序代码

这里,我们举一个缺少 schema 异常的例子。另一个错误是我们没有在 URL 中指定 HTTPS 或 HTTP。例如,要捕获此异常请求,我们使用 requests.exceptions.MissingSchema。在此程序代码中,我们将显示缺少 schema 异常。代码如下:

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

There is Missing schema which includes http or https

程序代码

这里,我们举一个连接错误异常的例子。假设您有一个不存在的网站。由于这里没有互联网连接,即使无法建立连接,也会发生错误。在此程序代码中,我们将显示连接错误异常。代码如下:

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

Connection error is occurring here

程序代码

在最后一个块中,定义了即使抛出异常也应始终执行的代码。它通常用于清理任务,如释放或注册。程序代码如下:

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

The request is successful
Cleaning up the code

程序代码

异常处理需要的不只是打印错误消息。为了获得良好的结果并检测错误,必须正确编写异常。您可以为此目的使用 Python logging 模块。程序代码如下:

输出

现在,我们在 Python 中编译上述代码,并在成功编译后运行它。在此示例中,logging.error() 方法用于将异常以 ERROR 级别记录到名为“error.log”的文件中。记录异常允许您稍后查看和解决问题。输出如下:

Request is successfully done!

程序代码

我们在这里汇总了到目前为止的所有尝试,目的是根据其自身优点解决异常。例如,当针对此 URL 运行此代码时,url= "https://www.hiii.com",将抛出一个异常请求。但是当没有连接时,requests.exceptions.ConnectionError 会打印一个连接错误,而当没有连接时,正常的异常请求会由 requests.exceptions.RequestException 处理。

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

HTTP Error has occurred
436 Client Error: status code 436 for url: https://www.hiii.com/

结论

在本教程中,我们将学习 Python Requests 模块的异常处理。通过了解常见异常、使用 try-except 块以及处理自定义异常和记录错误,异常对于解决性能问题和确保使用 Python Requests 模块时的代码可靠性至关重要。您可以创建能够处理意外事件的可靠应用程序。在设置和处理异常时,始终考虑您的具体用例。通过正确的异常处理,您可以提高 Python 应用程序的稳定性和质量。


下一个主题Exec-in-python