python学习打开day25

DAY 25 异常处理

知识点回顾:

  1. 异常处理机制
  2. debug过程中的各类报错
  3. try-except机制
  4. try-except-else-finally机制

在即将进入深度学习专题学习前,我们最后差缺补漏,把一些常见且重要的知识点给他们补上,加深对代码和流程的理解。

作业:理解今日的内容即可,可以检查自己过去借助ai写的代码是否带有try-except机制,以后可以尝试采用这类写法增加代码健壮性。

异常值处理机制:

Python的异常处理机制为程序提供了强大的容错能力 (fault tolerance)。当程序在运行时遇到意外情况(即异常),它不会直接崩溃,而是可以被设计成优雅地处理这些错误,并可能继续执行后续逻辑(如果设计允许)或以可控的方式结束。当异常发生时,Python会创建一个异常对象 (exception object)(通常是 Exception 类的子类实例)。如果这段可能出错的代码位于 try 语句块中,程序流程会寻找并跳转到匹配的 except 语句块(如果存在)来处理这个异常。

核心概念:

- try: 包含可能会引发异常的代码块。程序会首先尝试执行这里的代码。

- except: 如果try块中的代码确实引发了特定类型的异常(或者任何异常,如果未指定类型),则执行此代码块。

- else: (可选)如果try块中的代码没有发生任何异常,则执行此代码块。

- finally: (可选)无论try块中是否发生异常,总会执行此代码块(常用于资源清理)。

常见语句结构如下:

1. try-except:这是最基本的错误处理结构。

try:

    # 可能会引发异常的代码

except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError

    # 当 try 块中发生 ExceptionType 类型的异常时执行的代码

except: # 不推荐:捕获所有类型的异常,可能会隐藏bug

    # 当 try 块中发生任何其他未被前面 except 捕获的异常时执行的代码

逻辑说明: 程序首先尝试执行 try 块中的代码。如果 try 块中的代码没有发生异常,则 except 块会被跳过,程序继续执行 try-except 结构之后的代码。如果 try 块中的代码发生了异常,Python会查找与该异常类型匹配的 except 块。如果找到匹配的,则执行该 except 块中的代码,然后继续执行整个 try-except 结构之后的代码(除非 except 块中又引发了新异常或执行了return/break/continue 等)。如果未找到匹配的 except 块,异常会向上传播。

1. try-except-else

try-except 的基础上增加了 else 子句。

try:

    # 可能会引发异常的代码

except ExceptionType:

    # 当 try 块中发生 ExceptionType 类型的异常时执行的代码

else:

    # 当 try 块中【没有】发生任何异常时执行的代码

```

逻辑说明:

首先,执行 try 块中的代码。

如果 try 块中发生异常,则会查找并执行匹配的 except 块,else 块不会被执行。

如果 try 块中没有发生任何异常,则会跳过所有 except 块,然后执行 else 块中的代码。

与 if-else-elif 的区别(重要!):

if-elif-else 结构中,只有一个代码块会被执行(if 条件满足则执行 if 块;否则检查 elif,满足则执行 elif 块;否则执行 else 块)。

而在 try-except-else 结构中:

如果 try 成功:try 块的代码会执行,然后 else 块的代码也会执行。

如果 try 失败:try 块中出错前的代码会执行,然后匹配的 except 块的代码会执行(else 块不会执行)。

更准确的理解: else 子句中的代码是你希望在 try 块中的代码成功完成且没有引发任何异常之后才执行的代码。这通常用于分离“主要尝试的操作”和“操作成功后的后续步骤”,使得 try 块更聚焦于可能出错的部分。

一个简单的例子阐述 else 的作用:

try:

    # 假设 result_operation() 是一个可能出错的操作

    value = result_operation()

except SomeError:

    print("操作失败,使用默认值。")

    value = default_value

else:

    # 只有当 result_operation() 成功时,才执行这里的代码

    print(f"操作成功,结果是: {value}。现在进行后续处理...")

    process_value_further(value)

如果把 process_value_further(value) 放在 try 块内,那么如果 process_value_further 本身也可能抛出 SomeError(或其他 try 块想要捕获的错误),它就会被意外捕获。else 块确保了只有在 try 块中的代码完全无误地执行完毕后,才会执行 else 块的内容。

常见的报错:

python学习打开day25_第1张图片

try - except- else -fiinally

- try: 包含可能引发异常的代码。

- except: 处理在 try 块中发生的特定异常。

- else: (可选)如果 try 块中没有发生任何异常,则执行此代码块。

- finally: (可选)无论 try 块中是否发生异常,总会执行此代码块。

为什么使用 else?

1. 清晰性: 它清楚地将“主要尝试的操作(可能出错)”与“操作成功后的后续步骤”分开。

2. 避免意外捕获: 如果把“成功后的后续步骤”也放在 try 块里,而这些步骤本身也可能引发 try 块想要捕获的同类型异常,那么就会导致逻辑混淆。else 块中的代码不会被同一个 try 块的 except 子句捕获。

测试实例:

print("--- 1. SyntaxError ,可取消下列注释运行查看---")
# 示例 a: 缺少冒号
def my_function()
    print("Hello")
 
 
# 示例 b: 非法表达式
x = 5 +
print(x)
 
print(some_undefined_variable)
 
data = ("apple", "banana")
print(data[1])
 
print("--- try-except-else 示例 ---")
 
def safe_divide(a, b):
    print(f"\n尝试计算 {a} / {b}")
    try:
        result = a / b
    except ZeroDivisionError:
        print("错误:除数不能为零!")
        return None # 或者其他表示失败的值
    except TypeError:
        print("错误:输入必须是数字!")
        return None
    else:
        # 只有当 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") # TypeError

 @浙大疏锦行

你可能感兴趣的:(python学习打卡,学习)