模块 2 · 第 4 课(共 4)课程中的8/36~12 min
模块课程(4/4)
错误处理:尝试/例外
当运行时出现问题时(除以零、缺少键、
对不兼容类型的操作)Python 引发 异常。没有
处理时,异常会中断程序。使用 try / except 您
可以抓住它并决定做什么。
基本形式
Python
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # Nonetry:块包含可能失败的代码;- 仅当引发该错误类型时才执行
except <ErrorType>:在try内。
捕获异常消息
使用 as 将异常对象绑定到名称:
Python
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"多种类型在一起
Python
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = None类型元组捕获这些类型(或子类)的任何异常。
完整结构:try/ except/else/finally
Python
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— 将其用于依赖于try成功的代码。保留它 分开,这样您就不会意外捕获不相关的异常。finally— 必须始终进行的清理(关闭文件、释放 资源)。成功和错误时均执行。
引发异常:raise
有时,您是想要表明出现问题的人:
Python
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / b您将遇到并引发的最常见的内置异常:
ValueError— 该值具有正确的类型,但不可接受(例如解析)。TypeError— 类型错误(例如len(42))。KeyError/IndexError— 缺少键/索引。ZeroDivisionError— 除以零。FileNotFoundError、PermissionError— 文件系统操作。
try 块中的 else 和finally 子句
try 块可以定义两个附加子句:
else:仅当try块完成且未引发任何异常时才执行。finally:始终执行,无论是否发生异常。这非常适合清理资源(例如关闭打开的文件或数据库连接)。
自己尝试一下
锻炼#python.m2.l4.e1
尝试:0加载中...
编写一个尝试 int('abc') 的表达式:如果引发 ValueError,则将字符串 'errore' 分配给 `result`;否则分配号码。评估“结果”。
正在加载编辑器...
显示提示
int('abc') 引发 ValueError。
3 次尝试后可用的解决方案
复习练习
锻炼#python.m2.l4.e2
尝试:0加载中...
定义 `divide(a, b)`,它返回 a/b,但如果 b 为 0,则引发 ValueError 并显示消息“除数零”。然后在 try/ except 内调用 divide(10, 0) 并将捕获的异常的字符串分配给 `message`。
正在加载编辑器...
显示提示
在函数内引发 ValueError('...') ;捕获 except ValueError 作为 e。
3 次尝试后可用的解决方案
额外的挑战
锻炼#python.m2.l4.e3
尝试:0加载中...
编写一个 try- except 块将字符串 text_val = "abc" 转换为整数。如果转换引发“ValueError”,请将“None”分配给“result”。否则,分配转换后的数字。最后,评估“结果”。
正在加载编辑器...
显示提示
使用 try: result = int(text_val) 后跟 except ValueError: result = None。
3 次尝试后可用的解决方案