Python基础篇(九):错误和异常

前言

在Python中,错误(Error)和异常(Exception)是程序执行过程中可能出现的问题或错误情况。当程序遇到错误或异常时,它会引发相应的错误或异常对象,从而中断程序的正常执行流程。下面是对错误和异常的详细定义和说明,以及示例:

1. 错误(Error)

错误是指在程序执行过程中发生的一种无法处理或修复的问题,通常是由于编程错误或系统问题引起的。错误分为语法错误(SyntaxError)和逻辑错误(LogicError)。

1.1 语法错误

# 语法错误示例,缺少冒号:
if x > 5
    print("x 大于 5")

1.2 逻辑错误

# 逻辑错误示例,条件判断错误
x = 10
if x < 5:
    print("x 小于 5")

2. 异常(Exception)

异常是指在程序执行过程中出现的可预测的问题或异常情况,可以通过异常处理机制来捕获和处理。Python提供了许多内置的异常类,也可以自定义异常类。

在Python中,异常处理机制允许我们在程序中捕获和处理异常,以便在遇到问题时执行特定的操作而不中断程序的正常执行流程。异常处理的工作方式如下:

2.1 异常捕获(Try-Except)

使用tryexcept语句块来捕获并处理异常。在try块中放置可能引发异常的代码,如果异常发生,则会跳过剩余的try块代码,并将控制流转到匹配的except块。

示例:

try:
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
    print("结果:", result)
except ValueError:
    print("输入的不是有效的整数")
except ZeroDivisionError:
    print("除数不能为零")

2.2 异常抛出(Raise)

当代码执行过程中发生错误或异常情况时,可以使用raise语句手动引发一个异常。异常对象可以是内置的异常类或自定义的异常类。

示例:

def divide(x, y):
    if y == 0:
        raise ValueError("除数不能为零")
    return x / y

try:
    result = divide(10, 0)
    print("结果:", result)
except ValueError as e:
    print(e)

2.3 try-except-else语句

try-except-else语句允许在try块中的代码没有引发任何异常时执行一个额外的代码块,即else块。

示例:

try:
    # 尝试执行可能引发异常的代码
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
except ValueError:
    # 处理值错误异常
    print("输入的不是有效的整数")
except ZeroDivisionError:
    # 处理零除错误异常
    print("除数不能为零")
else:
    # 没有异常发生时执行的代码
    print("结果:", result)

2.4 try-except-finally语句

try-except-finally语句允许在try块中的代码引发异常或不引发异常时都执行一个必须执行的代码块,即finally块。

示例:

try:
    # 尝试执行可能引发异常的代码
    file = open("myfile.txt", "r")
    content = file.read()
except FileNotFoundError:
    # 处理文件不存在异常
    print("文件不存在")
except Exception as e:
    # 处理其他异常
    print("发生了异常:", e)
finally:
    # 无论是否引发异常,都会执行的代码
    file.close()

2.5 try-except-else-finally语句

try-except-else-finally语句结合了前两种语句的功能,允许在try块中的代码引发异常或不引发异常时都执行一个额外的代码块,并在最后执行一个必须执行的代码块

示例:

try:
    # 尝试执行可能引发异常的代码
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
except ValueError:
    # 处理值错误异常
    print("输入的不是有效的整数")
except ZeroDivisionError:
    # 处理零除错误异常
    print("除数不能为零")
else:
    # 没有异常发生时执行的代码
    print("结果:", result)
finally:
    # 无论是否引发异常,都会执行的代码
    print("执行finally块")

这些try-except语句的不同用法可以根据实际需要来选择。它们提供了更多灵活性和控制,使我们能够在处理异常时执行特定的操作,确保程序的可靠性和稳定性

2.6 异常处理的执行流程

  • 首先,执行 try 子句 (在 try 和 except 关键字之间的部分),
  • 如果没有异常发生, except 子句 在 try 语句执行完毕后就被忽略
  • 当异常发生时,程序的正常执行流程会立即中断,该子句其余的部分就会被忽略,并跳转到与异常类型匹配的except块。
  • 如果没有找到匹配的except块,异常将传播到调用当前代码的上层代码,直到找到匹配的except块或达到程序的顶层。
  • 如果异常在整个调用堆栈上没有被捕获,程序将终止,并显示默认的异常消息。

3. 自定义异常

在Python中,可以自定义异常类来表示特定的错误或异常情况,以便在程序中抛出和捕获这些异常。自定义异常类需要继承自内置的Exception类或其子类,并可以添加自定义的属性和方法。

以下是自定义异常的说明和示例:

3.1 自定义异常类的定义

自定义异常类可以通过继承Exception类或其子类来定义。可以为自定义异常类添加额外的属性和方法,以便更好地描述和处理特定的异常情况。

示例:

class MyException(Exception):
    pass

3.2 抛出自定义异常

使用raise语句可以在程序中抛出自定义异常。抛出自定义异常后,程序将中断正常的执行流程,并将控制权交给相应的异常处理代码。

示例:

def divide(x, y):
    if y == 0:
        raise MyException("除数不能为零")
    return x / y

try:
    result = divide(10, 0)
    print("结果:", result)
except MyException as e:
    print(e)

3.3 自定义异常的属性和方法

自定义异常类可以添加属性和方法,用于提供关于异常的附加信息或进行特定的操作。

示例:

class MyException(Exception):
    def __init__(self, message, code):
        super().__init__(message)
        self.code = code

    def get_error_code(self):
        return self.code

try:
    raise MyException("自定义异常", 500)
except MyException as e:
    print(e)
    print("错误代码:", e.get_error_code())

4. 内置异常类

4.1 异常类的层次结构

Python中的异常类形成了一个层次结构,这些异常类都是内置的,用于表示不同类型的错误和异常情况。下面是Python异常类的层次结构示意图:

BaseException
├── SystemExit
├── KeyboardInterrupt
├── GeneratorExit
├── Exception
    ├── StopIteration
    ├── StopAsyncIteration
    ├── ArithmeticError
    │   ├── FloatingPointError
    │   ├── OverflowError
    │   └── ZeroDivisionError
    ├── AssertionError
    ├── AttributeError
    ├── BufferError
    ├── EOFError
    ├── ImportError
        ├── ModuleNotFoundError
    ├── LookupError
    │   ├── IndexError
    │   └── KeyError
    ├── MemoryError
    ├── NameError
        ├── UnboundLocalError
    ├── OSError
        ├── FileNotFoundError
        ├── PermissionError
    ├── ReferenceError
    ├── RuntimeError
        ├── NotImplementedError
        ├── RecursionError
    ├── SyntaxError
        ├── IndentationError
            ├── TabError
    ├── SystemError
    ├── TypeError
    ├── ValueError
        ├── UnicodeError
            ├── UnicodeDecodeError
            ├── UnicodeEncodeError
            └── UnicodeTranslateError
    ├── Warning
        ├── DeprecationWarning
        ├── PendingDeprecationWarning
        ├── RuntimeWarning
        ├── SyntaxWarning
        ├── UserWarning
        ├── FutureWarning
        ├── ImportWarning
        ├── UnicodeWarning
        └── BytesWarning

在这个层次结构中,BaseException是所有异常类的基类,而Exception是大多数内置异常类的基类。异常类按照它们的特性和关系进行了分类和层级划分,使得可以根据不同的异常类型进行处理。

4.2 常见内置异常类及说明

下面是一些常见的Python内置异常类以及它们的说明:

异常类 说明
Exception 所有异常类的基类
SyntaxError 语法错误
IndentationError 缩进错误
TypeError 类型错误
NameError 名称错误
ValueError 值错误
ZeroDivisionError 除零错误
FileNotFoundError 文件不存在错误
IOError 输入/输出错误
IndexError 索引错误
KeyError 键错误
AttributeError 属性错误
ImportError 导入错误
ModuleNotFoundError 模块不存在错误
StopIteration 迭代器没有更多的值可返回错误
KeyboardInterrupt 用户中断执行
AssertionError 断言失败错误
TypeError 参数类型错误
UnboundLocalError 访问未初始化的局部变量错误
OverflowError 溢出错误
MemoryError 内存不足错误
RuntimeError 运行时错误
FileExistsError 文件已存在错误
PermissionError 权限错误

这些是一些常见的Python内置异常类,每个异常类都代表了特定类型的错误或异常情况。在编写代码时,了解这些异常类可以帮助我们更好地理解和处理程序中可能出现的问题。

猜你喜欢

转载自blog.csdn.net/qq_29864051/article/details/131354326