这个主题考什么
- 捕获你预期的具体异常,而不是所有错误。
- 按顺序追踪 try、except、else 和 finally。
- 抛出清楚的异常,而不是返回一个误导性的值。
常见错误
- 使用裸 except,把真正的编程错误也吞掉。
- 把太多代码放进 try,包括根本不会按预期失败的代码。
- 以为 finally 只在发生异常时执行。
样题
从完整题库中挑出的 10 道代表题。先自己作答,再展开答案。
-
1. 小明不管做奶茶成不成功都要关店门:try-except-finally 中 finally 何时执行?
显示答案
答案
C. 无论是否异常都执行解析: finally 在所有退出路径上都会执行:正常结束、异常被捕获、异常没被捕获,甚至 try 里 return。清理代码就该放这里。
-
2. 小明把 `except Exception` 写在 `except ValueError` 前面,ValueError 分支会怎样?
显示答案
答案
A. 永远不会执行解析: 处理器自上而下匹配,第一个命中就结束。Exception 能接住包括 ValueError 在内的普通错误,后面那个具体分支成了死代码。
-
3. 🧋 小明发现原料过期主动报错,raise 后不带异常类型会怎样?
显示答案
答案
A. 重新抛出当前异常解析: except 里的裸 raise 会重新抛出正在处理的异常,保留原始 traceback。常见于记完日志再交给调用方。
-
4. 把用户输入的 `'abc'` 转成整数失败,通常会抛出什么异常?
显示答案
答案
B. ValueError解析: int('abc') 失败在内容而不是类型,所以是 ValueError。TypeError 是传了 None 或列表这类东西。
-
5. 即使写入失败也要保证文件关闭,用哪个关键字打开?
____ open('orders.txt', 'w') as f: f.write('latte')显示答案
答案
with解析: with 会调用文件的上下文管理器,正常结束和异常时都关闭,相当于 try/finally。as f 绑定打开的文件对象。
-
6. try 语句中哪个关键字用来捕获异常?
显示答案
答案
except解析: except 指定要处理的异常类型并引出处理块。try 只负责标记被监视的代码,finally 管收尾不管捕获。
-
7. 主动抛出异常,横线填什么关键字?
if price < 0: ____ ValueError('价格不能为负')显示答案
答案
raise解析: raise ValueError(...) 用可展示的消息拒绝非法价格。前面有条件判断,合法价格会正常通过。
-
8. 异常被接住后 finally 还执行吗?输出什么?
try: print(1 / 0) except ZeroDivisionError: print("boom") finally: print("end")显示答案
答案
boom end
解析: 1/0 抛 ZeroDivisionError,进入 except 打印 boom;随后 finally 执行打印 end。异常被处理,所以不会抛出 traceback。
-
9. 计算器捕获除以零的错误。会打印什么?
try: print(10 / 0) except ZeroDivisionError: print("safe")显示答案
答案
safe解析: 10 / 0 在 print 执行前就抛了,try 里不会输出;随后处理器打印 safe。那次 print 根本没产生输出。
-
10. 转换失败时使用默认值,输出什么?
text = 'abc' try: qty = int(text) except ValueError: qty = 0 print(qty)显示答案
答案
0解析: int('abc') 抛 ValueError,处理器赋值 qty = 0,打印 0。失败时 except 一定执行,所以 qty 有定义。
常见问题
else 什么时候执行?
try 块没有异常地完成时,else 会执行。
应该捕获 Exception 吗?
通常只在边界处这样做:记录、清理,然后重新抛出或转换错误。具体异常应在你能处理它的地方捕获。
继续保持练习节奏。
完整题库会在这个浏览器里记住进度,支持按主题筛选,并包含每日一题和错题重练。