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?
说明抛出的不是这两种异常
在Python 3.6中,except的基本语法是except ExceptionType:,用来捕获指定类型的异常。如果你写的代码没有输出print,最常见的原因是异常没有被正确捕获。
看你的描述,问题很可能出在这几个地方:
- 异常类型不匹配:你试图捕获的异常类型(比如
ValueError)和实际发生的异常(比如KeyError)不一样,导致except块没执行。 - 异常在
try块外发生:如果异常发生在try块之前或者except块之后,它当然不会被捕获。 - 语法错误:
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,回头试试看

