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 反馈 — 无需本地设置。