菜鸟教程《Python 3 教程》笔记(19):错误与异常

这篇具有很好参考价值的文章主要介绍了菜鸟教程《Python 3 教程》笔记(19):错误与异常。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔记带有个人侧重点,不追求面面俱到。

19 错误和异常

出处: 菜鸟教程 - Python3 错误和异常

Python 有两种错误很容易辨认:语法错误异常

19.1 assert(断言)

assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,

语法格式:

assert expression [, arguments]

等效于:

if not expression:
    raise AssertionError(arguments)

实例:

>>> assert 1==2    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 不等于 2

19.2 异常处理

个人理解: 进行异常处理是为了避免直接抛出异常而导致暴露,通过接收不同的异常可以进行针对性地处理(或者做出提示)。

菜鸟教程《Python 3 教程》笔记(19):错误与异常,# 菜鸟教程《Python 3 教程》笔记,python,笔记
图片出处:菜鸟教程 - Python3 错误和异常

19.2.1 try/except

可以使用 try/except 语句异常捕捉。

try 语句执行逻辑:

  1. 执行 try 子句;
  2. 如果没有异常发生,忽略 except 子句,try 子句执行后结束,如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略;
  3. 如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行,如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中

一个 try 语句可能包含多个 except 子句,分别来处理不同的特定的异常,最多只有一个分支会被执行

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError, TypeError, NameError):
    pass

可以使用 Exception 捕获除了 SystemExitKeyboardInterruptGeneratorExit 之外的所有异常。 如果还想捕获这三个异常,可以将 Exception 改成 BaseException 即可。

except Exception as err:
    print(err)

最后一个 except 子句可以忽略异常的名称,它将被当作通配符使用。可以使用这种方法打印一个错误信息,然后再次把异常抛出:

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise  # 抛出异常

19.2.2 try/except…else

else 子句将在 try 子句没有发生任何异常的时候执行。使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。

19.2.3 try-finally 语句

finally 语句无论异常是否发生都会执行。

try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')

19.3 抛出异常

Python 使用 raise 语句抛出一个指定的异常。raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

raise [Exception [, args [, traceback]]]

如果只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

>>> try:
        raise NameError('HiThere')  # 模拟一个异常。
    except NameError:
        print('An exception flew by!')
        raise
   
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
NameError: HiThere

19.4 用户自定义异常

可以通过继承 Exception 类来自定义异常类。大多数的异常的名字都以 “Error” 结尾,就跟标准的异常命名一样。

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

19.5 清理行为

19.5.1 定义清理行为

不管 try 子句里面有没有发生异常,finally 子句都会执行。如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。

19.5.2 预定义的清理行为

关键词 with 语句可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法。就算在处理过程中出问题了,文件总是会关闭。

19.5.3 with 关键字

Python 中的 with 语句用于异常处理,封装了 try…except…finally 编码范式,提高了易用性。with 语句使代码更清晰、更具可读性, 它简化了文件流等公共资源的管理。在处理文件对象时使用 with 关键字是一种很好的做法。

实例:

with open('./test_runoob.txt', 'w') as file:
    file.write('hello world !')

等效于:

file = open('./test_runoob.txt', 'w')
try:
    file.write('hello world')
finally:
    file.close()

with 语句实现原理建立在上下文管理器之上。文章来源地址https://www.toymoban.com/news/detail-699247.html

到了这里,关于菜鸟教程《Python 3 教程》笔记(19):错误与异常的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 菜鸟教程《Python 3 教程》笔记(12):推导式

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 推导式 扩展阅读: Python 中的列表推导式 参考 12.1 列表推导式,将 [] 替换为 {} 。 注意: 元组推导式返回的结果是一个生成器对象。

    2024年02月10日
    浏览(34)
  • 菜鸟教程《Python 3 教程》笔记(15):数据结构

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 数据结构 在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。 遍历字典: 遍历列表: 遍历多个序列: 反向遍历:

    2024年02月10日
    浏览(31)
  • 菜鸟教程《Python 3 教程》笔记 EX 01:命令行参数

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 命令行参数 Python 中可以所用 sys 的 sys.argv 来获取命令行参数: 注意: sys.argv[0] 为脚本名。 实例: test.py 文件: 运行结果: getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数。该模块提供

    2024年02月10日
    浏览(27)
  • Python 3 | 菜鸟教程 (一)

    目录 一、Python3 简介 二、Python 发展历史 三、Python 特点 (一)易于学习 (二)易于阅读 (三)易于维护 (四)一个广泛的标准库 (五)互动模式 (六)可移植 (七)可扩展 (八)数据库 (九)GUI编程 (十)可嵌入 四、Python 应用 五、 Python3 环境搭建 六、Python3 下载 七

    2024年02月09日
    浏览(33)
  • Python教程_编程入门自学教程_菜鸟教程-免费教程分享

    Python - 教程 Python - 概述 Python - 环境设置 Python - 基本语法 Python - 变量类型 Python - 基本运算符 Python - 决策 Python - 循环 Python - 数字 Python - 字符串 Python - 列表 Python - 元组 Python - 字典 Python - 日期和时间 Python - 功能 Python - 模块 Python - 文件I / O. Python - 异常处理 Python - 面向对象

    2024年02月02日
    浏览(35)
  • python菜鸟教程-矩阵对应位置相加

    两个 3 行 3 列的矩阵,实现其对应位置的数据相加,并返回一个新矩阵: X = [[12,7,3],     [4 ,5,6],     [7 ,8,9]] Y = [[5,8,1],     [6,7,3],     [4,5,9]] 程序分析:创建一个新的 3 行 3 列的矩阵,使用 for 迭代并取出 X 和 Y 矩阵中对应位置的值,相加后放到新矩阵的对应位置中。

    2024年04月23日
    浏览(45)
  • Python3 函数与数据结构 | 菜鸟教程(十一)

    目录 一、Python3 函数 (一)定义一个函数 1、你可以定义一个由自己想要功能的函数,以下是简单的规则:  2、语法 3、实例 ①让我们使用函数来输出\\\"Hello World!\\\": ②更复杂点的应用,函数中带上参数变量: Ⅰ实例:比较两个数,并返回较大的数: Ⅱ实例:计算面积函数: (

    2024年02月11日
    浏览(32)
  • 使用Python pymysql连接Mysql数据库-菜鸟教程

    1、安装pymysql模块 pip install pymysql 2、启动Mysql数据库服务 net start mysql80  3、连接数据库 运行结果如下  4、创建数据库表 执行成功后,在本地登录mysql数据库进行查看验证   5、数据库插入操作  执行程序后在本地查看验证  6、数据库查询操作 Python查询Mysql使用 fetchone() 方法

    2024年02月04日
    浏览(36)
  • 菜鸟教程笔记:TypeScript

    1.在ts文件中:Runoob.ts 2.通过tsc命令编译 3.得到js代码:Runoob.js 4.使用node来执行js代码 我们可以同时编译多个ts文件: ts会忽略 空格 , 制表符 , 换行符 理解:对现实世界理解和抽象的方法 面向对象有两个概念:对象和类 对象:类的一个实例,有状态和行为。 类:是一个模板

    2024年02月07日
    浏览(35)
  • Python教程(19)——python异常处理

    在计算机编程中,异常(Exception)是指在程序执行过程中发生的错误或异常情况。当出现异常时,程序无法正常继续执行,因此需要采取一些特殊的措施来处理异常,以防止程序崩溃或产生意外结果。 异常可以在程序中的任何地方发生,可能是由错误的输入、无效的操作、资

    2024年02月03日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包