27.从入门到精通:Python异常处理 抛出异常 用户自定义异常 定义清理行为 预定义的清理行为

简介: 27.从入门到精通:Python异常处理 抛出异常 用户自定义异常 定义清理行为 预定义的清理行为

异常处理

在Python中,异常处理是一种处理程序在执行期间可能遇到的错误的方法。当Python解释器遇到错误时,它会引发异常。异常是一种Python对象,它包含有关错误的信息,例如错误类型和错误位置。

为了处理异常,您可以使用try-except语句。在try块中,您可以放置可能引发异常的代码。如果发生异常,解释器将跳过try块中的剩余代码,并查找与异常匹配的except块。如果找到匹配的except块,则其中的代码将被执行。如果没有找到匹配的except块,则异常将向上传递,直到找到匹配的块或程序终止。

下面是一个简单的示例,演示如何使用try-except语句处理除以零错误:

try:
    x = 1 / 0
except ZeroDivisionError:
    print("除以零错误!")

在这个例子中,我们尝试将1除以0,这会引发一个ZeroDivisionError异常。我们使用try-except语句来捕获这个异常,并在except块中打印一条错误消息。

除了except块,您还可以使用else和finally块。else块包含在try块中没有引发异常时要执行的代码。finally块包含无论是否引发异常都要执行的代码,例如清理资源。

下面是一个更复杂的示例,演示如何使用try-except-else-finally语句:

try:
    f = open("myfile.txt")
    x = 1 / 0
except ZeroDivisionError:
    print("除以零错误!")
except IOError:
    print("文件不存在或无法打开!")
else:
    print("没有发生异常!")
finally:
    f.close()

在这个例子中,我们尝试打开一个不存在的文件,并将1除以0。我们使用try-except-else-finally语句来捕获这两个可能引发的异常。在except块中,我们打印适当的错误消息。在else块中,我们打印一条消息,说明没有发生异常。在finally块中,我们关闭文件句柄,无论是否引发异常。


抛出异常

在 Python 中,我们可以使用 raise 语句来抛出异常。raise 语句用于在程序中手动引发异常,可以是 Python 内置异常或自定义异常。

以下是一个示例:

def divide(x, y):
    if y == 0:
        raise ZeroDivisionError("除数不能为零")
    return x / y
try:
    result = divide(10, 0)
except ZeroDivisionError as e:
    print(e)
else:
    print(result)

在上面的示例中,我们定义了一个 divide 函数,用于计算两个数的商。如果除数为零,则抛出 ZeroDivisionError 异常。在

try 代码块中,我们调用 divide 函数,并使用 except 代码块来捕获 ZeroDivisionError 异常并输出异常信息。当程序执行到 raise 语句时,会抛出一个异常并停止程序的执行。如果没有使用 try…except…finally 语句来捕获异常并处理异常,程序会直接崩溃并输出异常信息。


用户自定义异常

在Python中,您可以通过创建自己的异常类来定义自定义异常。自定义异常类是一个继承自Exception类的类,它可以包含自定义属性和方法。

下面是一个简单的示例,演示如何创建自定义异常类:

class MyError(Exception):
    def __init__(self, message):
        self.message = message

在这个例子中,我们创建了一个名为MyError的自定义异常类,它继承自Exception类。我们还定义了一个名为message的属性,该属性包含有关异常的信息。


要引发自定义异常,您可以像引发标准异常一样使用raise语句,并传递一个异常对象。例如:

raise MyError("发生了自定义异常!")

在这个例子中,我们引发了一个名为MyError的自定义异常,并传递了一个包含错误消息的字符串。

在捕获自定义异常时,您可以像捕获标准异常一样使用try-except语句。例如:

try:
    # some code that may raise MyError
except MyError as e:
    print(e.message)

在这个例子中,我们使用try-except语句捕获了可能引发MyError的代码。在except块中,我们打印了异常对象的message属性。


定义清理行为

在 Python 中,我们可以使用 try…finally 语句来定义清理行为。finally 代码块中的代码无论是否发生异常都会执行,常用于释放资源或者清理临时数据。

以下是一个示例:

try:
    # 可能会出现异常的代码块
    f = open("file.txt", "r")
    data = f.read()
    print(data)
finally:
    # 不管有没有异常,都会执行的代码块
    f.close()

在上面的示例中,我们尝试打开一个文件并读取其中的数据。无论是否出现异常,我们都会在 finally 代码块中关闭文件,以释放资源。

需要注意的是,如果 try 代码块中的代码出现异常并且没有被 except 代码块捕获,那么 finally

代码块中的代码也会被执行。因此,finally 代码块中的代码应该是安全的,不应该依赖于 try 代码块中的代码的执行结果。


预定义的清理行为

在 Python 中,您可以使用 with 语句来管理资源,例如文件句柄、网络连接或数据库连接。with 语句可以自动管理资源的获取和释放,确保在使用完资源后自动关闭或释放资源。这样可以避免资源泄漏和其他问题。

with expression as variable:
    # code block

其中,expression 是一个上下文管理器,variable 是一个变量,用于存储上下文管理器返回的对象。with 语句执行时,会调用上下文管理器的 enter() 方法,将返回的对象赋值给 variable,然后执行 code block。当code block 执行完毕后,会自动调用上下文管理器的 exit() 方法,释放资源。 Python 中有一些内置的上下文管理器,例如 open() 函数返回的文件对象就是一个上下文管理器,可以使用 with语句来管理文件句柄的获取和释放。另外,Python 还提供了 contextlib 模块,可以用于创建自定义上下文管理器。

下面是一个使用 with 语句管理文件句柄的示例:

with open('file.txt', 'r') as f:
    data = f.read()
    # do something with data

在这个示例中,我们使用 with 语句打开了一个名为 file.txt 的文件,并将文件对象赋值给变量 f。在 code block

中,我们读取了文件的内容,并对数据进行了处理。当 code block 执行完毕后,with 语句自动关闭了文件句柄,释放了资源。

相关文章
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
1天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
1天前
|
程序员 UED Python
Python入门:3.Python的输入和输出格式化
在 Python 编程中,输入与输出是程序与用户交互的核心部分。而输出格式化更是对程序表达能力的极大增强,可以让结果以清晰、美观且易读的方式呈现给用户。本文将深入探讨 Python 的输入与输出操作,特别是如何使用格式化方法来提升代码质量和可读性。
Python入门:3.Python的输入和输出格式化
|
1天前
|
机器学习/深度学习 人工智能 算法框架/工具
Python入门:1.Python介绍
Python是一种功能强大、易于学习和运行的解释型高级语言。由**Guido van Rossum**于1991年创建,Python以其简洁、易读和十分工程化的设计而带来了庞大的用户群体和丰富的应用场景。这个语言在全球范围内都被认为是**创新和效率的重要工具**。
Python入门:1.Python介绍
|
1天前
|
缓存 算法 数据处理
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
|
1天前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
1天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
7天前
|
人工智能 Shell 开发工具
[oeasy]python065python报错怎么办_try_试着来_except_发现异常
本文介绍了Python中处理异常的基本方法,重点讲解了`try`和`except`的用法。通过一个计算苹果重量的小程序示例,展示了如何捕获用户输入错误并进行处理。主要内容包括: 1. **回顾上次内容**:简要回顾了Shell环境、Python3游乐场和Vim编辑器的使用。 2. **编写程序**:编写了一个简单的程序来计算苹果的总重量,但发现由于输入类型问题导致结果错误。 3. **调试与修正**:通过调试发现输入函数返回的是字符串类型,需要将其转换为整数类型才能正确计算。
48 32
|
4天前
|
数据库 Python
[oeasy]python066_如何捕获多个异常_try_否则_else_exception
本文介绍了Python中`try...except...else`结构的使用方法。主要内容包括: 1. **回顾上次内容**:简要复习了`try`和`except`的基本用法,强调了异常处理的重要性。 2. **详细解释**: - `try`块用于尝试执行代码,一旦发现错误会立即终止并跳转到`except`块。 - `except`块用于捕获特定类型的异常,并进行相应的处理。 - `else`块在没有异常时执行,是可选的。 3. **示例代码**:通过具体例子展示了如何捕获不同类型的异常(如`ValueError`和`ZeroDivisionError`),并解释了异常处理
34 24

热门文章

最新文章

推荐镜像

更多