【成人版python基础入门】第三章 异常处理——给未知一个拥抱

在这里插入图片描述

异常处理——给未知一个拥抱

在编程的旅途中,遇到错误是常有的事。无论是疏忽大意还是不可预见的情况,错误都会时不时地出现。但是,不要害怕!Python 提供了强大的异常处理机制,让你可以优雅地处理这些“小惊喜”。通过学习异常处理,你可以确保程序在遇到问题时依然能够正常运行,而不是戛然而止。

什么是异常

在计算机科学中,异常是指程序在运行过程中出现的错误或意外情况。当程序遇到异常时,会停止正常执行,并抛出一个异常对象。如果异常没有被捕获,程序会崩溃并显示错误信息。

风趣的例子

假设你是一位勇敢的探险家,正在探索一片未知的森林。森林中充满了各种未知的危险,如陷阱、迷雾、野兽等。如果你不小心掉进陷阱,那么探险就会中止。但是,如果你事先准备了一根绳子,就可以在掉进陷阱后爬出来,继续探索。

在编程中,异常就像是探险中的陷阱,而异常处理机制就是那根绳子,帮助你爬出陷阱,继续前进。

程序中可能出现的各种错误

  1. 文件不存在:尝试打开一个不存在的文件。
  2. 权限问题:没有足够的权限读取或写入文件。
  3. 类型错误:变量类型不匹配,如将字符串与整数相加。
  4. 索引超出范围:访问列表或字符串的索引时,索引值超过了范围。
  5. 除以零:尝试进行除以零的运算。
  6. 格式错误:输入或输出的格式不符合预期。
  7. 网络连接问题:尝试连接网络时,网络不可用或连接失败。

这些错误就像是你在编程过程中遇到的各种小怪物,需要你用异常处理机制来驯服它们。

try-except 语句

什么是 try-except 语句

try-except 语句是 Python 中用于捕获和处理异常的结构。try 块中放置可能会抛出异常的代码,except 块中放置处理异常的代码。如果 try 块中的代码抛出异常,程序会跳转到 except 块中执行。

基本语法

try:
    # 可能会抛出异常的代码
    risky_code()
except ExceptionType:
    # 处理异常的代码
    handle_exception()

例子:处理除以零的异常

假设你编写了一个简单的程序,用于计算两个数的商。如果用户尝试将一个数除以零,程序会抛出 ZeroDivisionError 异常。我们可以使用 try-except 语句来捕获和处理这个异常。

def divide_numbers(a, b):
    try:
        result = a / b
        print(f"{a} 除以 {b} 的结果是: {result}")
    except ZeroDivisionError:
        print("除数不能为零,请重新输入。")

# 测试
divide_numbers(10, 2)  # 输出:10 除以 2 的结果是: 5.0
divide_numbers(10, 0)  # 输出:除数不能为零,请重新输入。

在这个例子中,如果 b 为零,a / b 会抛出 ZeroDivisionError 异常。except 块中的代码会捕获这个异常,并提示用户重新输入。

常见异常类型

FileNotFoundError

当尝试打开一个不存在的文件时,会抛出 FileNotFoundError 异常。

try:
    with open("nonexistent_file.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")

PermissionError

当尝试访问一个没有权限的文件时,会抛出 PermissionError 异常。

try:
    with open("protected_file.txt", "r") as file:
        content = file.read()
        print(content)
except PermissionError:
    print("没有权限读取文件,请检查文件权限。")

TypeError

当变量类型不匹配时,会抛出 TypeError 异常。

try:
    a = 10
    b = "2"
    result = a + b
except TypeError:
    print("类型错误,不能将整数与字符串相加。")

IndexError

当访问列表或字符串的索引超出范围时,会抛出 IndexError 异常。

try:
    my_list = [1, 2, 3]
    print(my_list[3])
except IndexError:
    print("索引超出范围。")

ValueError

当传递的参数不符合函数的预期时,会抛出 ValueError 异常。

try:
    number = int("abc")
except ValueError:
    print("格式错误,不能将 'abc' 转换为整数。")

IOError

当发生输入/输出错误时,会抛出 IOError 异常。在 Python 3 中,IOErrorOSError 取代,但 OSError 也可以处理类似的错误。

try:
    with open("diary.txt", "r") as file:
        content = file.read()
        print(content)
except OSError:
    print("发生输入/输出错误。")

KeyError

当访问字典中不存在的键时,会抛出 KeyError 异常。

try:
    my_dict = {"apple": 5, "banana": 3}
    print(my_dict["orange"])
except KeyError:
    print("字典中没有 'orange' 这个键。")

处理多种异常

一个 except 块处理多种异常

你可以在一个 except 块中处理多种异常类型,方法是将它们放在一个元组中。

try:
    with open("diary.txt", "r") as file:
        content = file.read()
        print(content)
except (FileNotFoundError, PermissionError, OSError) as e:
    print(f"发生错误: {e}")

多个 except

你也可以为每种异常类型单独编写一个 except 块,这样可以更精确地处理不同的错误。

try:
    with open("diary.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")
except PermissionError:
    print("没有权限读取文件,请检查文件权限。")
except OSError:
    print("发生输入/输出错误。")

使用 elsefinally

else

else 块中的代码会在没有发生异常时执行。这是用于处理正常情况的代码。

try:
    with open("diary.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")
else:
    print("文件内容:")
    print(content)

finally

finally 块中的代码无论是否发生异常,都会被执行。这通常用于做一些清理工作,如关闭文件。

try:
    file = open("diary.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")
finally:
    file.close()
    print("文件已关闭。")

代码样例:一个可以“救急”的错误处理小工具

假设你正在开发一个日记小助手,记录你每天的心情,通过文件操作实现数据的存储和读取。为了确保程序在遇到错误时能够优雅地处理,我们可以使用异常处理机制来“救急”。

代码实现

import os

# 定义日记文件的路径
diary_file = "my_diary.txt"

# 检查文件是否存在
if not os.path.exists(diary_file):
    try:
        with open(diary_file, "w") as file:
            file.write("这是我的日记本。\n")
    except IOError as e:
        print(f"创建文件时发生错误: {e}")

# 读取日记内容
try:
    with open(diary_file, "r") as file:
        print("当前日记内容:")
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")
except PermissionError:
    print("没有权限读取文件,请检查文件权限。")
except IOError as e:
    print(f"读取文件时发生错误: {e}")

# 记录新的日记内容
new_entry = input("请输入你今天的心情: ")
try:
    with open(diary_file, "a") as file:
        file.write(f"\n今天的心情: {new_entry}\n")
    print("新的日记内容已记录。")
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")
except PermissionError:
    print("没有权限写入文件,请检查文件权限。")
except IOError as e:
    print(f"记录日记时发生错误: {e}")

# 读取更新后的日记内容
try:
    with open(diary_file, "r") as file:
        print("更新后的日记内容:")
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件不存在,请检查文件名和路径。")
except PermissionError:
    print("没有权限读取文件,请检查文件权限。")
except IOError as e:
    print(f"读取更新后的日记时发生错误: {e}")

代码详解

  1. 检查文件是否存在

    if not os.path.exists(diary_file):
        try:
            with open(diary_file, "w") as file:
                file.write("这是我的日记本。\n")
        except IOError as e:
            print(f"创建文件时发生错误: {e}")
    

    使用 os.path.exists() 函数检查日记文件是否存在。如果不存在,尝试创建一个新的日记文件,并写入初始内容。如果在创建文件时发生输入/输出错误,会捕获并显示错误信息。

  2. 读取日记内容

    try:
        with open(diary_file, "r") as file:
            print("当前日记内容:")
            content = file.read()
            print(content)
    except FileNotFoundError:
        print("文件不存在,请检查文件名和路径。")
    except PermissionError:
        print("没有权限读取文件,请检查文件权限。")
    except IOError as e:
        print(f"读取文件时发生错误: {e}")
    

    使用 try-except 语句读取日记文件的内容,并输出。如果读取过程中发生 FileNotFoundErrorPermissionErrorIOError 异常,会捕获并显示相应的错误信息。

  3. 记录新的日记内容

    new_entry = input("请输入你今天的心情: ")
    try:
        with open(diary_file, "a") as file:
            file.write(f"\n今天的心情: {new_entry}\n")
        print("新的日记内容已记录。")
    except FileNotFoundError:
        print("文件不存在,请检查文件名和路径。")
    except PermissionError:
        print("没有权限写入文件,请检查文件权限。")
    except IOError as e:
        print(f"记录日记时发生错误: {e}")
    

    使用 input() 函数获取用户输入的新日记内容,然后尝试以追加模式打开文件,将新的内容写入文件。如果在写入过程中发生 FileNotFoundErrorPermissionErrorIOError 异常,会捕获并显示相应的错误信息。

  4. 读取更新后的日记内容

    try:
        with open(diary_file, "r") as file:
            print("更新后的日记内容:")
            content = file.read()
            print(content)
    except FileNotFoundError:
        print("文件不存在,请检查文件名和路径。")
    except PermissionError:
        print("没有权限读取文件,请检查文件权限。")
    except IOError as e:
        print(f"读取更新后的日记时发生错误: {e}")
    

    再次读取日记文件的内容,输出更新后的日记。如果读取过程中发生 FileNotFoundErrorPermissionErrorIOError 异常,会捕获并显示相应的错误信息。

运行结果

假设你运行了上面的代码,程序会先检查日记文件是否存在,如果不存在则创建一个新的日记文件。然后,程序会读取当前的日记内容并显示。接着,你输入当天的心情,程序将其记录到日记文件中。最后,程序会读取更新后的日记内容并显示。

例如:

当前日记内容:
这是我的日记本。

请输入你今天的心情: 今天天气真好,感觉非常开心。
新的日记内容已记录。
更新后的日记内容:
这是我的日记本。

今天的心情: 今天天气真好,感觉非常开心。

如果在某个步骤中发生错误,程序会友好地提示你,并继续运行后续的步骤。

摘要

编程时遇到错误是常有的事,但不要害怕!本文介绍了 Python 中异常处理的概念,教会你如何优雅地处理程序中可能出现的各种“小惊喜”。通过学习 try-except 语句和常见的异常类型,你可以确保程序在遇到问题时依然能够正常运行,而不是戛然而止。

  • 什么是异常:异常是指程序在运行过程中出现的错误或意外情况。
  • try-except 语句:用于捕获和处理异常,确保程序在遇到错误时能够优雅地处理。
  • 常见异常类型:包括 FileNotFoundErrorPermissionErrorTypeErrorIndexErrorValueErrorIOError 等。
  • 处理多种异常:可以在一个 except 块中处理多种异常类型,也可以为每种异常类型单独编写一个 except 块。
  • 使用 elsefinallyelse 块用于在没有发生异常时执行,finally 块无论是否发生异常都会执行,通常用于清理工作。

希望这篇教程能为你与 Python 的旅途带来更多的乐趣和信心。异常处理是编程中不可或缺的一部分,掌握异常处理的基本技巧,将使你在处理实际问题时更加得心应手。继续前行,探索更多 Python 的功能和编程技巧,让我们一起用 Python 编写出更多有用和有趣的应用。-America-拥抱未知,继续前进!🌟💖🚀

posted @   爱上编程技术  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示