一.错误和异常

两种错误:语法错误和异常

语法错误

if x == 1  # 缺少冒号
    print(x)
 

异常举例:

"1" + 2  # 字符串与整数无法相加
 

1.异常处理

try except用来捕抓异常

try:
    # 可能会引发异常的代码
    risky_operation()
except:
    # 异常处理代码
    handle_exception()
 
try:
    x = 1 / 0
except:
    print("不能除以零")

print("执行完毕")

 

try except执行完后,依然会继续执行程序

try :

        可能发生的异常

except 异常类型1 as 别名1:

        异常处理语句1

except (异常类型2,异常类型3) as 别名2:

        异常处理语句2

except:

        捕获处理所有类型异常

如果没有发生异常,程序会忽略except中的代码,继续向下执行

如果发生了异常,会忽略try中剩余代码,根据异常类型匹配到相应的except并执行其中的代码

如果发生异常,且异常类型无法和任何except匹配,异常将向外传递

一个except可以同时处理多个异常,把这些异常放在一个元组里面

异常处理结构:try-except-else

Python中的try-except-else结构用于捕获和处理代码执行过程中可能出现的异常,同时允许在无异常时执行特定代码块。

你希望在try块中有些操作执行成功后,在执行其他代码,那就可以把代码放到else语句块中。

try:
    # 尝试执行的代码
    risky_operation()
except ExceptionType:
    # 发生指定异常时的处理
    handle_exception()
else:
    # 无异常时执行的代码
    proceed_successfully()
 

ry-except-else-finally 结构详解

try-except-else-finally 是 Python 中用于异常处理的完整结构,每个部分有特定用途。

finally 块

  • 无论是否发生异常都会执行。
  • 常用于清理资源(如关闭文件、释放锁)。
def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Error: Division by zero")
    else:
        print("Result is", result)
    finally:
        print("Execution complete")

divide(10, 2)  # 输出结果和完成信息
divide(10, 0)  # 输出错误和完成信息
 

2.抛出异常

raise用来抛出异常

语法:

raise 异常类型("异常描述")
 
if x < 0:
    raise ValueError("x cannot be negative")
 

同try-except一起用

def validate_age(age):
    if age < 0:
        raise ValueError("年龄不能为负")

try:
    validate_age(-5)
except ValueError as e:
    print(f"捕获到错误: {e}")
 
#结果:捕获到错误: 年龄不能为负

assert断言机制

用于判断一个表达式,在表达式条件为false的时候触发异常,常常用于调试程序。

assert condition, "Error message"
 
  • condition:需要验证的布尔表达式
  • Error message:可选参数,断言失败时显示的错误信息

等价于

if not 表达式
    raise AssertionError([异常描述])

assert 的工作原理

  1. 程序执行到 assert 语句时,会先计算条件表达式
  2. 如果条件为 True,程序继续正常执行
  3. 如果条件为 False,抛出 AssertionError 并终止程序
def divide(a, b):
    assert b != 0, "Division by zero"
    return a / b
 

3.自定义异常

通过直接或者间接继承Exception类来创建自己的异常。

自定义异常类通常继承自 Exception 类。可以添加额外的属性和方法来提供更多错误信息。

class ValidationError(Exception):
    """带有额外属性的自定义异常"""
    def __init__(self, message, errors):
        super().__init__(message)
        self.errors = errors

def validate_data(data):
    errors = []
    if not data.get('name'):
        errors.append("缺少名称字段")
    if errors:
        raise ValidationError("数据验证失败", errors)

try:
    validate_data({})
except ValidationError as e:
    print(f"错误信息: {e}")
    print(f"详细错误: {e.errors}")
 

4.异常的传递

异常传递的基本规则

  • 当函数内部发生异常且未被捕获时,异常会传递给调用该函数的地方。
  • 如果调用处也未捕获,异常继续向上传递,直到被 try-except 块捕获。
  • 若始终未被捕获,程序终止并打印异常信息。

当存在try嵌套或者函数嵌套时,若内层出现了异常且在内层无法处理,会将异常一层一层向外传递,直到异常被处理或程序报错

def func1():
    raise ValueError("异常在 func1 中抛出")

def func2():
    func1()

def func3():
    try:
        func2()
    except ValueError as e:
        print(f"捕获到异常: {e}")

func3()
 
捕获到异常: 异常在 func1 中抛出
 

5.with关键字

python中with语句用于异常处理。封装了try except finally编码范式,提供了一种简洁方式来确保资源的正确获取和释放,同时处理可能发生的异常,提高了易用性。

语法

with expression as variable:
    # 代码块

expression返回一个上下文管理器对象,即实现了__enter__和__exit__方法。

variable__enter__方法的返回值赋给变量(可选)。

try:
    with open("text.txt","wt") as file:
        file.write(str1)

finally:
    print("文件是否关闭:",file.closed) #文件会关闭,关闭操作是with帮忙做的

6.常用异常

Python 常见异常类型总结

以下表格整理了 Python 中常见的异常类型及其触发场景:

异常类型 触发场景
SyntaxError 语法错误,代码不符合 Python 语法规则
IndentationError 缩进错误,属于 SyntaxError 的子类
NameError 尝试访问未定义的变量或函数
TypeError 操作或函数应用于不适当类型的对象
ValueError 传入的参数类型正确但值不合法
IndexError 序列索引超出范围
KeyError 字典中访问不存在的键
AttributeError 尝试访问对象不存在的属性
ImportError 导入模块或模块中的内容失败
ModuleNotFoundError 导入的模块不存在(Python 3.6+)
ZeroDivisionError 除数为零
FileNotFoundError 尝试打开不存在的文件
PermissionError 没有足够的权限访问文件或资源
KeyboardInterrupt 用户按下中断键(通常是 Ctrl+C)
MemoryError 内存不足
OverflowError 数值运算结果超出表示范围
RecursionError 递归深度超过最大限制
StopIteration 迭代器没有更多的值
AssertionError assert 语句失败
NotImplementedError 抽象方法未实现
RuntimeError 一般运行时错误,通常作为其他运行时异常的基类
OSError 操作系统相关的错误,如文件操作失败
UnicodeError Unicode 编码/解码错误
TimeoutError 操作超时
EOFError 读取文件时到达文件末尾

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐