Python 异常捕获与处理

2023-11-16

一、基础知识

1.1 什么是异常

当我们写程序难免遇到报错,专业的称呼叫做异常,行业俗语叫做bug,由于异常情况出现会导致代码停止运行,所以在编写过程中要尽可能避免。

1.2 异常分类

  • 语法错误
    这一类错误很好理解,相当于你不会写,比如用if或for的时候不知道他们怎么写,这种情况比较夸张了,好好学过的人都不会犯这种错误,一般来说这种错误发现了就是要准备跑路了。
  • 逻辑错误
    这种情况在编写的时候是允许出现的,通常来说都是代码结构完整,但是在调用的时候出了各种错误如:顺序错了或是变量用错了导致的异常。

1.3 异常的结构

我们可以分成三部分看:

  • 错误位置
    报错的位置是占最大部分的,我们从这里知道什么位置运行代码出错了,通常来说在错误位置很多的时候只用看最下面那个。
  • 错误类型
    最下面一行左边的几个单词是标志你的错误类型的,通常也不用管,起到提示作用
  • 错误详情
    这里比较关键,错误详情会把你错误的地方进行一个具体的解释,好让你找到错误并改正

二、异常类型

当我们在编写python代码的时候会出现各种原因导致的异常,这里我们可以举一些常见的例子:

  • AssertionError
    当 assert 语句失败时将被引发。用户利用断言语句检测异常时,如果断言语句检测的表达式为假,则会引发这种异常。

  • KeyError
    KeyError是关键字错误,当在现有键集合中找不到指定的映射(字典)键时就会引发错误。这个异常主要发生在字典中,比如当用户试图访问一个字典中不存在的键时会被引发。

  • NameError
    NameError是当某个局部或全局名称未找到时将被引发,也就是指变量名称发生错误,比如用户试图调用一个还未被赋值或初始化的变量时会被触发。

  • ValueError
    当操作或函数接收到具有正确类型但值不适合的参数,也就是值错误,比如想获取一个列表中某个不存在值的索引。

  • SystemError
    当解释器发现内部错误,但情况看起来尚未严重到要放弃所有希望时将被引发。 关联的值是一个指明发生了什么问题的字符串(表示为低层级的符号)。

  • SyntaxError
    SyntaxError主要是因为当解析器遇到语法错误,比如少个冒号、多个引号之类的,编程时稍微疏忽大意一下就会出错,应该是最常见的一种异常错误了。

  • TypeError
    TypeError是类型错误,当一个操作或函数被应用于类型不适当的对象时将被引发。比如在要求 int 时却传入了 list就会导致错误。

  • IndexError
    当序列抽取超出范围时将被引发,也就是索引超出范围,比如最常见下标索引超出了序列边界,比如当某个序列m只有三个元素,却试图访问m[4]。

  • StopIteration
    StopIteration为迭代器错误,由内置函数 next() 和 iterator 的 next() 方法所引发,用来表示该迭代器不能产生下一项。当访问至迭代器最后一个值时仍然继续访问,就会引发这种异常。

  • AttributeError
    AttributeError是属性错误,当属性引用或赋值失败时就会出现。比如列表有index方法,而字典却没有,所以对一个字典对象调用该方法就会引发该异常。

  • AttributeError
    访问的对象属性不存在

  • ImportError
    无法导入模块或者对象,主要是路径有误或名称错误

  • IndentationError
    代码没有正确对齐,主要是缩进错误

  • IOError
    输入/输出异常,主要是无法打开文件

  • OverflowError
    数值运算超出最大限制

  • TabError
    Tab和空格混用

  • ZeroDivisionError
    除法运算中除数0 或者 取模运算中模数为0

三、异常处理语法结构

在python中我们有专门的语法结构来应对一些将要出错的代码:

3.1 语法结构

try:
	待监测的代码(可能会出错的代码)
except 错误类型 as e:
	针对上述错误类型制定的方案

功能讲解:
1、try在这里可以看成是尝试的意思,相应的我们把需要监测的代码放里面运行。如果代码出现的错误是except中的,那么就用下面的子代码进行处理。

2、except后面的as e可以不写,写了的话会返回系统提示的报错信息。

3、当我们使用try监测代码的时候只能监测一个错误,当代码检测到第一个错误的时候就会输出提示信息然后停止代码的运行,后面的错误就不会被检测到。

4、这里我们也发现了,一个except只能应对一种错误类型,如果错误类型很多的话我们有两种选择,一种是写很多个except把错误类型写全,第二种选择是在错误类型处写上Exception/BaseException,就是后面要说的万能异常

try:
	待监测的代码(可能会出错的代码)
except 错误类型1 as e:  # e就是系统提示的错误信息
	针对上述错误类型1制定的方案
except 错误类型2 as e:  # e就是系统提示的错误信息
	针对上述错误类型2制定的方案
except 错误类型3 as e:  # e就是系统提示的错误信息
	针对上述错误类型3制定的方案
 	 ...

3.2 万能异常

对应的异常类型是:Exception/BaseException

两个异常类型作用一样,都包含所有的错误类型,但是BaseException是Exception的父代码。

try:
	待监测的代码(可能会出错的代码)
except Exception as e:  # e就是系统提示的错误信息
	针对各种常见的错误类型全部统一处理

3.3 try语法结构结合else和finally

try结构结合else和finall功能很简单:

1、else后面跟的子代码是在try的子代码正常运行的时候才会执行的

2、finally是不管try的子代码运行是否正确都会运行的代码

try:
	待监测的代码(可能会出错的代码)
except Exception as e:  # e就是系统提示的错误信息
	针对各种常见的错误类型全部统一处理
else:
	try的子代码正常运行结束没有任何的报错后 再执行else子代码
finally:
	无论try的子代码是否报错 最后都要执行finally子代码

注意事项
1、虽然异常处理可以防止代码报错停止运行,但是这并不意味着我们可以多用异常处理减少异常。

2、异常处理应该尽量少用,当出现无法控制的情况报错才考虑使用,如手机软件在无法访问网络的时候使用异常处理进行提示现在没网不能运行。

3、try语法结构下监测的代码应该尽量少一些。

四、异常处理补充

4.1 断言

断言就是对一段代码进行判断,如果判断结果正确就继续运行,如果判断错误了就抛出AssertionError异常,直接中断代码的运行。

name = 'jason'
# assert isinstance(name, int)
assert isinstance(name, str)
print('哈哈哈 我就说吧 肯定是字符串')
name.strip()

这里我们用isinstance判断数据的类型,如果把name绑定的字符串换成列表就会中断代码的运行抛出AssertionError异常。

4.2 主动抛出异常

跟上面的断言原理相似,当我运行代码检测到指定的数据值或条件的时候就直接抛出异常中断代码的运行。主动抛出异常需要用到raise这个方法,或是断言中的assert方法。

raise 异常类型名称(‘异常描述’)

try:
    if len(self._node_list) == 0:
        raise ValueError('Wrong parameter format')
except ValueError as e:
    print(e)

参考资料

Python 异常捕获与处理:https://www.cnblogs.com/wei0919/p/17201755.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 异常捕获与处理 的相关文章

  • pydev 断点不起作用

    我正在使用 python 2 7 2 sqlalchemy 0 7 unittest eclipse 3 7 2 和 pydev 2 4 开发一个项目 我在 python 文件 单元测 试文件 中设置断点 但它们被完全忽略 之前 在某些时候
  • Pytorch - 推断线性层 in_features

    我正在构建一个玩具模型来获取一些图像并进行分类 我的模型看起来像 conv2d gt pool gt conv2d gt linear gt linear 我的问题是 当我们创建模型时 我们必须计算第一个线性层的大小in features基
  • Keras model.summary() 结果 - 了解参数数量

    我有一个简单的神经网络模型 用于使用 Keras Theano 后端 从用 python 编写的 28x28px 图像中检测手写数字 model0 Sequential number of epochs to train for nb ep
  • 将文件标记为从 Python 中删除?

    在我的一个脚本中 我需要删除当时可能正在使用的文件 我知道我无法删除正在使用的文件 直到它不再使用为止 但我也知道我可以将该文件标记为由操作系统 Windows XP 删除 我将如何在 Python 中做到这一点 以及另一个不依赖于 pyw
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • 为什么我会得到“ufunc 'multiply' did not contains a loop with Signature Matching types dtype('S32') dtype('S32') dtype('S32')”,其值来自 raw_

    我正在尝试创建一个非常简单的程序 它将绘制一个抛物线 其中v是速度 a是加速度和x是时间 用户将输入值v and a then v and a and x将决定y 我试图用这个来做到这一点 x np linspace 0 9 10 a ra
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • Django“模型”对象不可迭代

    我有一张表 其中显示了已注册的员工 我想根据他们的数据库生成一个简单的 HTML 页面 其中包括他们的姓名 id 职称等 为此 我将一个 id 传递给视图 以便它可以获取相应用户的详细信息并向我显示 一切正常 直到出现错误对象不可迭代 下面
  • 按字符串子字符串的列过滤 Pandas 数据框

    我正在尝试使用列中的字符串值是数据框外部字符串的子字符串的条件来过滤数据框 下面的例子 df a b c hello bye hello reference str hello there output a c 一种方法可能是使用正则表达式
  • Python 中嵌套列表的排序和分组

    我有以下数据结构 列表的列表 4 21 1 14 2008 10 24 15 42 58 3 22 4 2somename 2008 10 24 15 22 03 5 21 3 19 2008 10 24 15 45 45 6 21 1 1
  • 手动安装开放多语言世界网 (NLTK)

    我正在使用一台只能访问专用网络并且无法从命令行发送指令的计算机 因此 每当我必须安装 Python 包时 我都必须手动安装 我什至不能使用 Pypi 幸运的是 NLTK 允许我手动下载语料库 从here https www nltk org
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • 完全定制的Python帮助用法

    我正在尝试使用 Python 创建完全自定义的 帮助 用法 我计划将其导入到许多我想要具有风格一致性的程序中 但遇到了一些麻烦 我不知道为什么我的描述忽略换行符 尝试过 和 我无法让 出现在 ARGS 行的 换行符之后 显然它们坐在自己的行
  • 自适应支付 API 错误 580001

    我正在 python 中向 paypal 自适应支付 API 发出 PAY 请求 并收到通用错误 id 580001 没有其他信息 headers API credentials for the API caller business ac
  • CryptoJS 和 Pycrypto 一起工作

    我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
  • 如何在 matplotlib 中第一个 x 轴的底部添加第二个 x 轴?

    我指的是已经提出的问题here https stackoverflow com questions 10514315 how to add a second x axis in matplotlib 在此示例中 用户通过将第二个轴添加到与标
  • 枚举上的 random.choice

    我想用random choice on an Enum I tried class Foo Enum a 0 b 1 c 2 bar random choice Foo 但是这段代码失败了KeyError 我怎样才能随机选择一个成员Enum
  • python 相当于 sed

    有没有一种方法 无需双循环即可完成以下 sed 命令的操作 Input Time Banana spinach turkey sed i Banana s Toothpaste file Output Time BananaToothpas
  • float() 参数必须是字符串或数字,而不是“时间戳”

    我无法使 scilearn 与日期时间系列一起工作 找到了这篇文章 但对我没有帮助 Pandas 类型错误 float 参数必须是字符串或数字 https stackoverflow com questions 41256626 panda
  • 将同一 numpy 数组的两个视图组合成单个视图而不复制数组?

    我有一个大型 2d numpy 数组 我想删除它的子集并处理函数剩下的内容 我需要对许多子集执行此操作 因此理想情况下我不想每次都创建数组的副本 该函数不会更改数组中的任何值 mat np load filename mat 1 mat i

随机推荐

  • RSA算法简介

    RSA算法简介 一 RSA算法简述 在RSA密码体制中 每个用户都拥有两个密钥 公钥PK e n 和私钥SK d n 公钥PK e n 用于加密 也成为加密密钥 可以再网络 电话簿等媒体上进行公布 私钥SK d n 用于解密 也称为解密密钥
  • 刀片式服务器与虚拟机,为什么人们在开发虚拟主机时更喜欢刀片服务器?

    服务器制造商正在不断开发刀片技术 因此刀片服务器的处理器性能和内存容量已达到10年前的超级计算机水平 毫无疑问 刀片服务器曾经实现了 事半功倍 的承诺 但现在需要重新考虑这个问题 人们为什么在虚拟主机的开发中更喜欢刀片服务器 使刀片服务器缺
  • 为什么mysql source命令导入数据比可视化工具执行sql文件快?

    在一般情况下 使用MySQL的source命令导入数据比使用可视化工具执行SQL文件更快 这是因为涉及到了不同的执行方式和优化策略 批量执行 vs 逐条执行 source命令会将整个SQL文件作为一个批量进行执行 而可视化工具往往是逐条读取
  • VS Code搭配code runnner编译时提示:g++: fatal error: no input files解决方法

    如下图所示 如果我们使用的是windows系统 当我们编写好C 文件之后 执行run code命令 就会出现的下面的错误提示 g error testCodeRunnner cpp No such file or directory g f
  • Even Degree【2020 年 “游族杯”E题】【欧拉回路】

    题目链接 题意 有N个点 M条边 每次可以删去一条两端点的度不都是奇数的边 问最多可以删除几条边 题目保证初始所有点度为偶数 首先 题目保证了初始的时候所有的点的度都是为偶数的 于是原图中的每一个联通块一定是一个欧拉回路 对于欧拉回路 最好
  • android:configChanges属性

    今天有幸去哥们的大公司做了半天的暂时工 一个偶现的Bug折腾了他好久 好不easy今天抓到了异常Log日志 大致的意思就是android view windowleaked 窗口泄漏 我在网上查了资料 Android的每个Activity都
  • 简单使用visio画时序图

    1 时序图作用 时序图是强调消息时间顺序的交互图 描述了对象之间传递消息的时间顺序 用来表示用例中德行为顺序 纵轴是时间轴 时间沿竖线向下延伸 横轴代表了协作各独立的对象 2 时序图包含了4个元素 1 对象 Object 2 生命线 Lif
  • h2数据库 mysql 区别_开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译) h2数据库...

    开源数据库 H2 HSQLDB DERBY PostgreSQL MySQL区别 对比图表 浪天涯博主翻译 referential integrity 参考完整性 transactions 事物 unicode 统一码 interface
  • 推荐一些PyCharm中常用的插件,实用且炫酷

    工欲善其事 必先利其器 PyCharm 上面的插件是非常实用的 能够巧妙的使用插件对于我们的开发功能的帮助非常大 下面小编为大家推荐一些不错的插件 1 Key Promoter X 快捷键 用来提示快捷键的插件 帮助我们尽可能的摆脱鼠标操作
  • mysql--窗口函数

    一 前言 由力扣题引发的一次窗口函数的学习 mysql从8 0开始支持窗口函数 使用窗口函数 会令我们的分组查询变得便捷 二 概念 一 定义 窗口函数 对一个查询SQL 将其结果集按指定的规则进行分区 每个分区可以看作是一个窗口 分区内的每
  • 安卓Kotlin 使用ViewPager2实现简易左右滑动翻页效果

    布局很简单 R layout onepage仅有一个占满全屏幕的ImageView名为onei R layout activity view仅有一个占满全屏幕的ViewPager2名为vp 以下为Activity的全部代码 class Vi
  • 读完 DALL-E 论文,我们发现大型数据集也有平替版

    内容提要 OpenAI 团队的新模型 DALL E 刷屏 这一新型神经网络 使用 120 亿参数 经过 特训 任意描述性文字输入后 都可以生成相应图像 如今 团队将这一项目的论文和部分模块代码开源 让我们得以了解这一神器背后的原理 原创 H
  • 做BI领域的ChatGPT,思迈特升级一站式ABI平台

    8月8日 以 指标驱动 智能决策 为主题 2023 Smartbi V11系列新品发布会在广州丽思卡尔顿酒店开幕 后疫情时代 BI发展趋势的观察与应对 在发布会上 思迈特CEO吴华夫在开场致辞中表示 当前大环境背景下 数字化转型是企业高质量
  • 网站服务器记录攻击日志ctf,通过网站日志分析sql注入攻击的痕迹

    一次偶然的机会 我的朋友给我发了一个日志文件 让我看一下服务器access log文件 说是CTF的题目 给了它这样一个access文件 随后要了flag 因为我是专业划水的 CTF基本上不碰它 我也不知道怎么做 所以我试着分析了一下下 打
  • 用c++制作c++

    用c 制作c 我想了半年了 终于成功了 那么接下来我给大家分享一下我用c 制作c 的代码吧 include
  • 免费获取知网文献----浙江图书馆+支付宝

    使用支付宝办理浙江图书馆读者证 在支付宝搜索 浙江图书馆 并进入其生活号 开通借阅服务 办理读者证 使用读者证号登录浙江图书馆官网 通过以上步骤成功办理读者证后 会获取一个读者证号 在支付宝 浙江图书馆 生活号的首页或个人中心可以看到 使用
  • matlab 日期加小时数_matlab建立连续时间的时间函数

    满意答案 dashengjia 推荐于 2016 05 22 采纳率 55 等级 12 已帮助 7603人 这个是内建函数 源码不公开 CUMSUM Cumulative sum of elements For vectors CUMSUM
  • JSON 数据类型转换工具

    简介 本文介绍一款数据类型转换工具 可以将JSON格式数据转换成YAML MYSQL XML TOML JavaScript等数据类型 背景 在日常的开发工程中 我们经常使用JSON表达数据 但有些时候我们需要使用YAML JavaScri
  • Cannot make a static reference to the non-static method getLocalActivityManager()

    Cannot make a static reference to the non static method getLocalActivityManager from the type ActivityGroup 想调用getLocalA
  • Python 异常捕获与处理

    文章目录 一 基础知识 1 1 什么是异常 1 2 异常分类 1 3 异常的结构 二 异常类型 三 异常处理语法结构 3 1 语法结构 3 2 万能异常 3 3 try语法结构结合else和finally 四 异常处理补充 4 1 断言 4