Python训练营打卡 Day25

 异常处理

知识点回顾:

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

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

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

1. 异常处理机制

异常处理是一种在程序运行时处理错误和异常情况的机制。当程序运行过程中遇到错误时,会抛出一个异常,如果不对异常进行处理,程序会中断运行。
Python的异常处理机制为程序提供了强大的容错能力 (fault tolerance)。当程序在运行时遇到意外情况(即异常),它不会直接崩溃,而是可以被设计成优雅地处理这些错误,并可能继续执行后续逻辑(如果设计允许)或以可控的方式结束。

当异常发生时,Python会创建一个异常对象 (exception object)(通常是 Exception 类的子类实例)。如果这段可能出错的代码位于 try 语句块中,程序流程会寻找并跳转到匹配的 except 语句块(如果存在)来处理这个异常。

2. Debug 过程中的各类报错

在调试过程中,我们经常会遇到各种错误,例如:

  • 语法错误(SyntaxError):代码不符合 Python 的语法规则。

  • 运行时错误(RuntimeError):代码在运行时出现问题,例如除以零、访问不存在的文件等。

  • 类型错误(TypeError):操作或函数应用于不适当类型的对象。

  • 索引错误(IndexError):尝试访问序列中不存在的索引。

  • 键错误(KeyError):尝试访问字典中不存在的键。

  • 文件不存在错误(FileNotFoundError):尝试打开一个不存在的文件。

3. try-except 机制

try-except 是最基本的异常处理结构,用于捕获和处理异常。基本语法如下:

try:
    # 尝试执行的代码
    result = 10 / 0
except ZeroDivisionError as e:
    # 捕获并处理异常
    print(f"发生错误:{e}")

如果 try 块中的代码抛出异常,except 块会捕获并处理该异常。

4. try-except-else-finally 机制

try-except-else-finally 是更完整的异常处理结构,提供了更多的控制能力。基本语法如下:

try:
    # 尝试执行的代码
    result = 10 / 2
except ZeroDivisionError as e:
    # 捕获并处理 ZeroDivisionError 异常
    print(f"发生错误:{e}")
else:
    # 如果没有异常发生,执行 else 块
    print("没有发生异常,结果是:", result)
finally:
    # 无论是否发生异常,都会执行 finally 块
    print("finally 块总是被执行")
  • else:如果没有异常发生,会执行 else 块。

  • finally:无论是否发生异常,finally 块都会被执行,通常用于清理资源,如关闭文件、释放网络连接等。

  • 通过添加 try-except 机制来增强其健壮性:

    原始代码:

    file_path = "example.txt"
    with open(file_path, "r") as file:
        content = file.read()
    print(content)

    改进后的代码:

  • file_path = "example.txt"
    try:
        with open(file_path, "r") as file:
            content = file.read()
        print(content)
    except FileNotFoundError as e:
        print(f"文件未找到:{e}")
    except Exception as e:
        print(f"发生其他错误:{e}")
    else:
        print("文件读取成功!")
    finally:
        print("文件操作完成。")
    示例:网络请求

    如果你有涉及网络请求的代码,也可以添加异常处理。例如,使用 requests 库获取网页内容:

    原始代码:

    import requests
    response = requests.get("https://example.com")
    print(response.text)

    改进后的代码:

  • import requests
    
    try:
        response = requests.get("https://example.com")
        response.raise_for_status()  # 检查请求是否成功
        print(response.text)
    except requests.exceptions.HTTPError as e:
        print(f"HTTP 错误:{e}")
    except requests.exceptions.ConnectionError as e:
        print(f"连接错误:{e}")
    except Exception as e:
        print(f"发生其他错误:{e}")
    else:
        print("请求成功!")
    finally:
        print("网络请求完成。")

    核心概念:

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

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

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

        4. 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 块,异常会向上传播。

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

try:
    # 可能会引发异常的代码
except ExceptionType:
    # 当 try 块中发生 ExceptionType 类型的异常时执行的代码
else:
    # 当 try 块中【没有】发生任何异常时执行的代码

逻辑说明:

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

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

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

3.try - except- else -fiinally
- try: 包含可能引发异常的代码。

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

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

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

finally 子句

finally 子句中的代码无论 try 块中是否发生异常,也无论 except 块是否被执行,甚至无论 try 或 except 块中是否有 return 语句,它总会被执行。

finally这个无论如何都会执行的特性,在机器学习和深度学习的中,多涉及资源的保存、文件的关闭等。

1. 无论训练成功、失败还是中途被打断,都确保日志文件被正确关闭,避免数据丢失或文件损坏。

2. 确保计算资源在使用完毕后被释放,供其他进程或任务使用。更常见的是使用 with 语句来自动管理这类资源,with 语句本身就隐式地使用了类似 finally 的机制。(with open语句)

3. 关闭数据库连接

4. 恢复全局状态或配置, 如果程序在运行过程中修改了全局变量或配置文件,在异常处理结束后,需要恢复到之前的状态或配置。

5. 模型训练可能非常耗时,如果中途因为各种原因(OOM、手动中断、硬件故障)停止,我们希望记录下中断的状态,方便后续恢复。

在ML/DL项目中,由于流程长、资源消耗大、外部依赖多,finally 提供的这种“保证执行”的机制对于构建稳定、可靠的系统至关重要

  • 各类报错信息        

Python训练营打卡 Day25_第1张图片

@浙大疏锦行

你可能感兴趣的:(python自学打卡,python,开发语言)