跳转到主要内容
模块 2 · 第 4 课(共 4)课程中的8/36~12 min
模块课程(4/4)

错误处理:尝试/例外

当运行时出现问题时(除以零、缺少键、 对不兼容类型的操作)Python 引发 异常。没有 处理时,异常会中断程序。使用 try / except 您 可以抓住它并决定做什么。

基本形式

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • try: 块包含可能失败的代码;
  • 仅当引发该错误类型时才执行 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 exception
  • else — 将其用于依赖于 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 次尝试后可用的解决方案