错误处理 · 10 道样题

Python 异常处理练习题与答案

异常处理不是把错误藏起来。它要判断哪些错误可以恢复,哪些应该让程序停下,以及调用方需要知道什么。这些题目检查这种判断。

39 道题在完整题库中 · 14 道选择 · 14 道填空 · 11 道输出

这个主题考什么

  • 捕获你预期的具体异常,而不是所有错误。
  • 按顺序追踪 try、except、else 和 finally。
  • 抛出清楚的异常,而不是返回一个误导性的值。

常见错误

  • 使用裸 except,把真正的编程错误也吞掉。
  • 把太多代码放进 try,包括根本不会按预期失败的代码。
  • 以为 finally 只在发生异常时执行。
样题

样题

10

从完整题库中挑出的 10 道代表题。先自己作答,再展开答案。

  1. 选择题q0972

    1. 小明不管做奶茶成不成功都要关店门:try-except-finally 中 finally 何时执行?

    1. 只有异常时
    2. 只有无异常时
    3. 无论是否异常都执行
    4. 从不执行
    显示答案

    答案

    C. 无论是否异常都执行

    解析: finally 在所有退出路径上都会执行:正常结束、异常被捕获、异常没被捕获,甚至 try 里 return。清理代码就该放这里。

  2. 选择题q0980

    2. 小明把 `except Exception` 写在 `except ValueError` 前面,ValueError 分支会怎样?

    1. 永远不会执行
    2. 仍会先执行
    3. 抛 SyntaxError
    4. 执行两次
    显示答案

    答案

    A. 永远不会执行

    解析: 处理器自上而下匹配,第一个命中就结束。Exception 能接住包括 ValueError 在内的普通错误,后面那个具体分支成了死代码。

  3. 选择题q0985

    3. 🧋 小明发现原料过期主动报错,raise 后不带异常类型会怎样?

    1. 重新抛出当前异常
    2. 抛出RuntimeError
    3. 什么都不做
    4. 报错
    显示答案

    答案

    A. 重新抛出当前异常

    解析: except 里的裸 raise 会重新抛出正在处理的异常,保留原始 traceback。常见于记完日志再交给调用方。

  4. 选择题q1000

    4. 把用户输入的 `'abc'` 转成整数失败,通常会抛出什么异常?

    1. FileNotFoundError
    2. ValueError
    3. KeyError
    4. TypeError
    显示答案

    答案

    B. ValueError

    解析: int('abc') 失败在内容而不是类型,所以是 ValueError。TypeError 是传了 None 或列表这类东西。

  5. 填空题q0974

    5. 即使写入失败也要保证文件关闭,用哪个关键字打开?

    ____ open('orders.txt', 'w') as f:
        f.write('latte')
    显示答案

    答案

    with

    解析: with 会调用文件的上下文管理器,正常结束和异常时都关闭,相当于 try/finally。as f 绑定打开的文件对象。

  6. 填空题q0993

    6. try 语句中哪个关键字用来捕获异常?

    显示答案

    答案

    except

    解析: except 指定要处理的异常类型并引出处理块。try 只负责标记被监视的代码,finally 管收尾不管捕获。

  7. 填空题q0998

    7. 主动抛出异常,横线填什么关键字?

    if price < 0:
        ____ ValueError('价格不能为负')
    显示答案

    答案

    raise

    解析: raise ValueError(...) 用可展示的消息拒绝非法价格。前面有条件判断,合法价格会正常通过。

  8. 输出预测q0973

    8. 异常被接住后 finally 还执行吗?输出什么?

    try:
        print(1 / 0)
    except ZeroDivisionError:
        print("boom")
    finally:
        print("end")
    显示答案

    答案

    boom
    end

    解析: 1/0 抛 ZeroDivisionError,进入 except 打印 boom;随后 finally 执行打印 end。异常被处理,所以不会抛出 traceback。

  9. 输出预测q0987

    9. 计算器捕获除以零的错误。会打印什么?

    try:
        print(10 / 0)
    except ZeroDivisionError:
        print("safe")
    显示答案

    答案

    safe

    解析: 10 / 0 在 print 执行前就抛了,try 里不会输出;随后处理器打印 safe。那次 print 根本没产生输出。

  10. 输出预测q1004

    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 吗?

通常只在边界处这样做:记录、清理,然后重新抛出或转换错误。具体异常应在你能处理它的地方捕获。

继续保持练习节奏。

完整题库会在这个浏览器里记住进度,支持按主题筛选,并包含每日一题和错题重练。

打开完整练习