Python3.6 中 except 语法是怎么样的,为什么我这样写遇到异常网页时都不输出下面的 print?

示例:(之前时没有写 as e 的,但结果都是一样不输出)
try:
r = requests.get(url, headers=headers)
except requests.exceptions.ConnectionError as e:
print(e, url)
time.sleep(1)
except requests.exceptions.ChunkedEncodingError as e:
print(e, url)
time.sleep(1)
Python3.6 中 except 语法是怎么样的,为什么我这样写遇到异常网页时都不输出下面的 print?


17 回复

说明抛出的不是这两种异常


在Python 3.6中,except的基本语法是except ExceptionType:,用来捕获指定类型的异常。如果你写的代码没有输出print,最常见的原因是异常没有被正确捕获。

看你的描述,问题很可能出在这几个地方:

  1. 异常类型不匹配:你试图捕获的异常类型(比如ValueError)和实际发生的异常(比如KeyError)不一样,导致except块没执行。
  2. 异常在try块外发生:如果异常发生在try块之前或者except块之后,它当然不会被捕获。
  3. 语法错误except语句本身写错了,比如少了冒号。

给你个典型例子和修正:

有问题的代码(假设异常类型不匹配)

try:
    # 假设这里访问网页,但发生了requests.exceptions.ConnectionError
    response = requests.get("http://无效网址.com")
    data = response.json()
    print(data["key"])  # 如果key不存在,这里会抛KeyError
except ValueError:  # 错误!这只能捕获ValueError,但实际可能是ConnectionError或KeyError
    print("捕获到异常!")
print("这行总是会执行")

修正后的代码

import requests
from requests.exceptions import RequestException

try:
    response = requests.get("http://无效网址.com")
    response.raise_for_status()  # 如果HTTP状态码不是200,抛出HTTPError
    data = response.json()
    print(data["key"])
except RequestException as e:
    # 捕获所有requests库的网络相关异常
    print(f"网络请求出错: {e}")
except KeyError as e:
    # 捕获字典键不存在的错误
    print(f"键不存在: {e}")
except Exception as e:
    # 捕获其他所有异常(谨慎使用)
    print(f"发生未知错误: {e}")
print("这行总是会执行")

关键点

  • 用更具体的异常类型(如RequestException)替代通用的Exception
  • 使用as e来获取异常对象,方便打印错误信息。
  • 多个except块按顺序匹配,第一个匹配到的会被执行。

建议:先确认实际抛出的异常类型,再调整except语句。

你改成捕捉所有异常看看不就好了?

没捕获到你指定类型的异常

如果我没记错的话,没连上是返回 None 还是啥吧。
又或者是 r 的某一种状态,比如 r.code==403 之类的?
也就是说 try 的内容成功了,不会走到 except 吧?要么你换 except Exception 看看。

不是这个问题好吧,直接 except:都是一样的结果

试过了,一样

试过了,一样

请问大致可以怎么写呢?

那就没有抛异常,或者不是在这个位置抛出的。

我只有大概印象哦
r = requests(url)
if r.code == 200:
print(‘ok’)
else:
print(‘error’, url)

具体建议去看下 requests 的文档,不长的。

是 r.status_code

resp = requests.get(url)
if not resp.ok:
print(url, resp.reason)

我看了下,好像超时未响应是会出错的,那你就加一个 except Exception 好了。

ok,回头试试看

回到顶部