0Pricing
Python Academy · 课时

try / except / else / finally

为各种场景组织异常处理代码块。

try / except / else / finally 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

介绍

Python 的 try/except/else/finally 可以让您完全控制错误处理和清理工作。

基本的 try/except

try: risky_code() except ExceptionType: handle()——只有在引发该异常类型时,Python 才会执行 except 代码块。
try:
    x = int('abc')
except ValueError:
    print('not a number')

捕获异常对象

except ValueError as e: 会将异常绑定到 e。使用 str(e) 或 e.args 获取消息。
try:
    int('oops')
except ValueError as e:
    print(f'Error: {e}')

捕获多个异常

except (TypeError, ValueError) as e: 可以捕获任一类型。
for val in ['abc', None, 42]:
    try:
        print(int(val))
    except (TypeError, ValueError) as e:
        print(f'skipping {val!r}: {e}')

裸 except(请避免使用)

except:(不指定类型)会捕获 EVERYTHING,包括 KeyboardInterrupt 和 SystemExit。这几乎总是错误的做法——请始终指定类型。
try:
    risky = 1/0
except ZeroDivisionError:
    print('division error')  # specific

多个 except 子句

您可以使用多个 except 代码块,分别处理不同类型。Python 会按顺序尝试它们。
def process(val):
    try:
        return 10 / int(val)
    except ValueError:
        print('not a number')
    except ZeroDivisionError:
        print('division by zero')
process('abc')
process('0')

else 子句

try/except/else 中的 else 只有在没有引发 NO 异常时才会执行。请将应在成功时运行的代码放在这里。
try:
    x = int('42')
except ValueError:
    print('bad input')
else:
    print('parsed:', x)

finally 子句

finally:ALWAYS 会运行——try 成功后、except 执行后,甚至 return 或 break 执行后也会运行。它非常适合执行清理工作。
def read_file(path):
    f = None
    try:
        f = open(path)
        return f.read()
    except FileNotFoundError:
        return None
    finally:
        if f: f.close()
print(read_file('/nonexistent'))

带有 return 的 finally

如果同时存在 return 和 finally,finally 会先运行,但 finally 中的返回值会生效。请务必小心。
def demo():
    try:
        return 'try'
    finally:
        return 'finally'  # overrides!
print(demo())

嵌套的 try 代码块

try 代码块可以嵌套。如果内部异常没有被内部 except 捕获,就会向外传播。
try:
    try:
        x = 1/0
    except ValueError:
        print('inner')
except ZeroDivisionError:
    print('outer caught it')

记录异常

import logging; logging.exception('msg') 会记录完整的回溯信息,非常适合在生产代码中使用。
import logging
try:
    1/0
except ZeroDivisionError:
    logging.exception('Caught an error')

快速检查

无论是否发生异常,哪个子句都会运行?

回顾

try/except 会捕获错误。else 会在成功时运行。finally 会始终运行(用于清理)。请捕获具体类型,避免使用裸 except。使用 as e 访问异常。

继续学习

做得很好!请继续下一课,持续进步。

常见问题解答

「try / except / else / finally」课时是免费的吗?

是的 — 「try / except / else / finally」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「try / except / else / finally」这节课中我会学到什么?

为各种场景组织异常处理代码块。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「try / except / else / finally」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 理解异常
  2. try / except / else / finally
  3. 引发与重新引发异常
  4. 自定义异常类
← 返回 Python Academy