python打卡day25
知识点回顾:
- 异常处理机制
- debug过程中的各类报错
- try-except机制
- try-except-else-finally机制
在即将进入深度学习专题学习前,我们最后差缺补漏,把一些常见且重要的知识点给他们补上,加深对代码和流程的理解。
作业:理解今日的内容即可,可以检查自己过去借助ai写的代码是否带有try-except机制,以后可以尝试采用这类写法增加代码健壮性。
异常处理的核心概念是:
- try: 包含可能会引发异常的代码块。程序会首先尝试执行这里的代码
- except: 如果try块中的代码确实引发了特定类型的异常(或者任何异常,如果未指定类型),则执行此代码块
- else: (可选)如果try块中的代码没有发生任何异常,则执行此代码块
- finally: (可选)无论try块中是否发生异常,总会执行此代码块(常用于资源清理)
常见语句结构;
1、try-except
try:# 可能会引发异常的代码
except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码
程序首先尝试执行 try 块中的代码,如果 try 块中的代码没有发生异常,则 except 块会被跳过,程序继续执行 try-except 结构之后的代码。如果 try 块中的代码发生了异常,Python会查找与该异常类型匹配的 except 块。如果找到匹配的,则执行该 except 块中的代码,然后继续执行整个 try-except 结构之后的代码(除非 except 块中又引发了新异常或执行了 return/break/continue 等)。如果未找到匹配的 except 块,异常会向上传播
类比: 你可以把它看作是:“尝试做这件事,如果出错了(并且是特定类型的错误),就执行补救措施。”
2、try-except-else
try:# 可能会引发异常的代码
except ExceptionType:# 当 try 块中发生 ExceptionType 类型的异常时执行的代码
else:# 当 try 块中【没有】发生任何异常时执行的代码
执行 try 块中的代码,如果 try 块中发生异常,则会查找并执行匹配的 except 块,else 块不会被执行。如果 try 块中没有发生任何异常,则会跳过所有 except 块,然后执行 else 块中的代码
print("--- try-except-else 示例 ---")def safe_divide(a, b):print(f"\n尝试计算 {a} / {b}")try:result = a / bexcept ZeroDivisionError:print("错误:除数不能为零!")return None # 或者其他表示失败的值except TypeError:print("错误:输入必须是数字!")return Noneelse:# 只有当 try 块中的 a / b 成功执行时,这里才会执行print("除法运算成功!")print(f"结果是: {result}")# 可以在这里进行基于成功结果的进一步操作print(f"结果的两倍是: {result * 2}")return result# 测试用例
safe_divide(10, 2) # 成功
safe_divide(10, 0) # ZeroDivisionError
safe_divide("10", 2) # TypeError (如果我们不先做类型转换的话)
safe_divide(20, "abc") # TypeErro
3.try-except-else-finally
finally 子句中的代码无论 try 块中是否发生异常,也无论 except 块是否被执行,甚至无论 try 或 except 块中是否有 return 语句,它总会被执行。这个特性,在机器学习和深度学习的中,多涉及资源的保存、文件的关闭等
一般的异常报错如下:
SyntaxError (语法错误) 原因: 代码不符合 Python 的语法规则(比如少个逗号冒号,表达式非法啥的),解释器在尝试解析代码时就会失败。这种错误在程序运行之前就会被检测到
NameError (名称错误) 原因: 尝试使用一个未被定义的变量、函数或对象的名称(手滑打错了变量名也是)
TypeError (类型错误) 原因: 对一个不支持该操作的数据类型执行了某个操作或函数
ValueError (值错误) 原因: 函数接收到的参数类型正确,但其值不合适或无效
IndexError (索引错误) 原因: 尝试访问序列(如列表、元组、字符串)中一个不存在的索引
KeyError (键错误) 原因: 尝试访问字典中一个不存在的键
AttributeError (属性错误) 原因: 尝试访问一个对象没有的属性或方法(比如说本该是方法的函数,被当成属性用了)
ZeroDivisionError (除零错误) 原因: 尝试将一个数字除以零
FileNotFoundError (文件未找到错误) 原因: 尝试打开一个不存在的文件(通常是在读模式下),或者路径不正确
ModuleNotFoundError (导入错误) 原因:尝试导入一个不存在的模块,或者模块存在但其中的特定名称找不到, Python 的模块加载器找不到这个模块。去安装库即可,如果是自定义的模块,配置好对应的路径
眼熟一下吧,免得报错了只会丢给大模型解答
@浙大疏锦行