Python基础异常处理梳理总结

目录
  • 前言
  • 一、常见的Python异常
    • AssertionError:断言语句(assert)失败
    • AttributeError:尝试访问未知的对象属性
    • IndexError:索引超出序列的范围
    • KeyError:字典查找一个不存在的关键字
    • NameError:尝试访问一个不存在的变量
    • OSError:操作系统产生的异常
    • SyntaxError:Python的语法错误
    • TypeError:不同类型间的无效操作
    • ZeroDivisionError:除数为零
  • 二、try-except语句
  • 三、对多个异常统一处理
  • 四、捕获所有异常
  • 五、try-finally语句
  • 六、raise语句
  • 七、丰富的else语句
  • 八、简洁的with语句

前言

我们是人,也会经常犯错,程序员也不例外,就算是经验丰富的码农,也不能保证写的代码百分之百没有任何问题。另外,作为一个合格的程序员,在编程时要意识到一点,那就是永远不要相信你的用户,所以要多方面考虑,这样写出来的程序才会更加安全稳定。

那么既然程序总会出问题,那我们就需要用适当的方法去解决问题。程序出现逻辑错误或者用户输入不合法都会引发异常,但这些异常并不是致命的,不会导致程序崩溃,可以利用Python提供的异常处理机制,在异常出现的时候及时捕获,并从内部自我消化掉。

那么什么是异常呢?举个例子:

这里当然假设用户的输入是正确的,但是只要用户输入一个不存在的文件名,那么上面的代码是不堪一击的:

上面的例子就抛出了一个FileNotFoundError异常,那么Python还可能抛出哪些异常呢,在下面给大家介绍一下常见的异常,这样以后遇到这样的异常时就不会感到陌生了。

一、常见的Python异常

AssertionError断言语句(assert)失败

在以前的分支和循环章节中讲过断言语句(assert),当assert这个关键字后边的条件为假的时候,程序将终止并抛出AssertionError异常。assert语句一般是在测试程序的时候用于在代码中置入检查点:

AttributeError:尝试访问未知的对象属性

当试图访问的对象属性不存在时抛出的异常:

IndexError:索引超出序列的范围

在使用序列的时候就常常会遇到IndexError异常,原因是索引超出序列范围的内容

KeyError:字典查找一个不存在的关键字

试图在字典中查找一个不存在的关键字时就会引发KeyError异常,因此建议使用dict.get()方法

NameError:尝试访问一个不存在的变量

尝试访问一个不存在的变量时,Python会抛出NameError异常:

OSError:操作系统产生的异常

OSError顾名思义就是操作系统产生的异常,像打开一个不存在的文件会引发FileNotFoundError,而这个FileNotFoundError就是OSError的子类。上面的例子已经演示过,这里就不再赘述了。

SyntaxError:Python的语法错误

如果遇到SyntaxError是Python的语法错误,这时Python的代码并不能继续执行,你应该找到并改正错误:

TypeError:不同类型间的无效操作

有些类型不同是不能相互进行计算的,否则会抛出TypeError异常:

ZeroDivisionError:除数为零

我们都知道除数不能为零,所以除以零就会引发ZeroDivisionError异常:

二、try-except语句

try-except语句格式如下:

try:
  检测范围
except Exception[as reason]:
  出现异常(Exception)后的处理代码

try-except语句用于检测和处理异常,举个例子来说明这一切是如何工作的。

前面我们也介绍过,当要打开的文件不存在时,就会引发FileNotFoundError,显然用户的体验不好,因此我们可以这样修改:

其执行结果是:

上面的例子由于使用了大家习惯的语言来描述错误信息,用户体验会好很多。

但是从程序员的角度来看,导致OSError异常的原因有很多(例如FileNotFoundError、FileExistsError、PermissionError等),所以可能会更在意错误的具体内容,这里可以使用as把具体的错误消息打印出来

其执行结果为:

针对不同异常设置多个except

一个try语句可以和多个except语句搭配,分别对感兴趣的异常进行检测处理:

三、对多个异常统一处理

except后面还可以跟多个异常,然后对这些异常进行统一的处理:

四、捕获所有异常

如果你无法确定要对哪一类异常进行处理,只是希望在try语句块里一旦出现任何异常,可以给用户一个“看得懂”的提醒,那么可以这么做:

五、try-finally语句

看下面这个例子,如果"a.txt"确实存在,open()函数可以正常返回文件对象,但异常却发生在打开文件后的sum = 1 + ‘1’语句上,此时Python将直接跳到except语句,也就是说,文件打开了,但并没有执行关闭文件的命令:

为了实现这种“就算出现异常,但也不得不执行的收尾工作(比如在程序崩溃前保存用户文档)”,引入了finally来扩展try:

如果try语句块中没有出现任何运行时错误,会跳过except语句执行finally语句块的内容。
如果出现异常,则会先执行except语句块的内容再执行finally语句块的内容。
总之,finally语句块中的内容就是确保无论如何都将被执行的内容。

六、raise语句

有些读者可能会思考,我的代码能不能自己抛出一个异常呢?答案是可以的,你可以使用raise语句抛出一个异常

抛出的异常还可以带参数,表示异常的解释

七、丰富的else语句

对于绝大多数编程语言来说,else语句都只能跟if语句搭配,但是在Python里,else语句的功能更加丰富。在Python中,else语句不仅能跟if语句搭,跟循环语句(for语句或while语句)搭配,还能跟刚才所讲的异常处理进行搭配

1、典型的if-else语句

if 条件:
  条件为真执行
else:
  条件为假执行

2、else与for和while循环语句搭配

举个例子:

这段程序主要是求用户输入的数的最大约数,如果是素数的话会提醒这是一个素数。
使用暴力的方法一个个尝试(num%count==0),如果符合条件则打印出最大的约数,并break,同时不会执行else语句块的内容了。但如果一直没有遇到合适的条件,则会执行else语句块内容。

for语句的用法和while语句一样,这里便不再赘述了。

3、else语句与异常处理进行搭配

else语句还能和刚刚讲的异常处理进行搭配,只要try语句块里没有出现任何异常,那么就会执行else语句块里的内容

举个例子:

八、简洁的with语句

有些读者觉得打开文件又要关闭文件,还要关注异常处理有点麻烦,所以Python提供了一个with语句,利用这个语句抽象出文件操作中频繁使用的try/except/finally相关的细节,对文件操作使用with语句,将大大减少代码量。

举个例子:

使用with语句,可以改成这样:

有了with语句,就再也不用担心忘记关闭文件了。

到此这篇关于Python基础异常处理梳理总结的文章就介绍到这了,更多相关Python异常处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  •  Python错误与异常处理

    1. 从键盘输入一个整数,求 100 除以它的商,并显示输出.要求对从键盘输入的数值进行异常处理. try:     n=int(input("请输入一个整数:"))     x=100/n     print(x) except ValueError:     print("异常,请重新输入:") else:         #可选项,必须try-except语句为前提     print("程序正常运行,没有捕捉到异常") 2.编程实现索引超

  • 详解python文件的操作和异常的处理

    目录 一. 文件的操作 1.1创建文件 1.2写入数据 1.3读数据 1.4 2读数据 1.5读写数据 1.6删除文件 1.7写入文件 1.8读取图片 1.9备份图片 1.10文件重命名 1.11创建文件夹 1.11获取当前目录 二.异常 2.1各种异常的演示 2.2捕捉异常 2.3try/finally 2.4异常的传递 2.5触发异常 2.6自定义异常 总结 一. 文件的操作 1.1创建文件 格式:f = open('文件', 'w')或者f = open('文件', 'r') 1.2写入数

  • Python Pandas读取Excel日期数据的异常处理方法

    目录 异常描述 出现原因 解决方案:修改自定义格式 pandas直接解析Excel数值为日期 总结 异常描述 有时我们的Excel有一个调整过自定义格式的日期字段: 当我们用pandas读取时却是这样的效果: 不管如何指定参数都无效. 出现原因 没有使用系统内置的日期单元格格式,自定义格式没有对负数格式进行定义,pandas读取时无法识别出是日期格式,而是读取出单元格实际存储的数值. 解决方案:修改自定义格式 可以修改为系统内置的自定义格式: 或者在自定义格式上补充负数的定义: 增加;@即可 p

  • python数据分析实战指南之异常值处理

    目录 异常值 1.异常值定义 2.异常值处理方式 2.1 均方差 2.2 箱形图 3.实战 3.1 加载数据 3.2 检测异常值数据 3.3 显示异常值的索引位置 总结 异常值 异常值是指样本中的个别值,其数值明显偏离其余的观测值.异常值也称离群点,异常值的分析也称为离群点的分析. 常用的异常值分析方法为3σ原则.箱型图分析.机器学习算法检测,一般情况下对异常值的处理都是删除和修正填补,即默认为异常值对整个项目的作用不大,只有当我们的目的是要求准确找出离群点,并对离群点进行分析时有必要用到机器学

  • 如何在Python中进行异常处理

    目录 一.抛出异常和自定义异常 1.raise语句 2.自定义异常类型 二.捕捉异常 1.捕捉多个异常 2.获取异常信息 三.finally子句 一.抛出异常和自定义异常 Python中使用用异常对象(exception object)表示异常情况,当程序运行遇到错误后,就会触发发异常.相信大家在编码是都会遇到这种情况,那么如果异常对象并未被处理或捕捉,程序就会用报错然后终止执行. 1.raise语句 Python中的raise 关键字用于触发发一个异常,和我们熟悉的Java中的throw关键字

  • Python异常处理如何才能写得优雅(retrying模块)

    目录 前言 不负责任版本 简单处理版本 改进处理版本 安装与使用 安装 使用 总结 前言 在写程序时,我们会经常碰到程序出现异常,这时候我们就不得不处理这些异常,以保证程序的健壮性. 处理异常的版本有以下几种,你通常的做法是哪种? 不负责任版本 这种情况下,不作任何处理,任由程序报错,从而导致程序中断. 针对简单的程序,这样做没什么问题,大不了我遇到问题之后把问题解决,然后重新运行.但是如果是复杂的系统就会很麻烦了,可能你一个异常阻塞了系统的运行,带来灾难性的后果. 简单处理版本 简单处理版本,

  • python异常处理并调试

    目录 一.try-except 二.try-except-else 三.try-except-finally 四.处理多个异常 五.raise主动抛出异常 前言: 异常是错误出现时,可以在正常的控制流程之外采取的行为. 一.try-except try:     age = int(input("请输入年龄:"))     if age >= 18:         print("你已成年")     else:         print("你未成

  • Python基础知识方法重写+文件处理+异常处理

    目录 一.方法重写 二.运算符重载 三.文件处理 打开关闭文件 文件读写 四.异常处理 异常 抛出异常 最后 前言; Python基础知识+结构+数据类型 Python基础学习列表+元组+字典+集合 Python基础学习函数+模块+类 今天给大家分享的是第四篇,前面几篇我都放在上面了.小伙伴可以自己巩固复习 一.方法重写 print("-------------方法重写------------"); # coding=utf-8 class Parent: # 定义父类 def myM

  • Python学习之异常处理详解

    目录 什么是异常与异常处理 异常的语法 捕获通用异常 捕获具体异常 如何捕获多个异常 捕获多个异常-方法1 捕获多个异常-方法2 本章节主要学习 python 中的异常处理,来看一下该章节的内容有哪些.首先我们需要了解 什么是异常与异常的处理 ,然后再继续 异常的语法结构 什么是异常与异常处理 异常 —> 可以理解为不同寻常. 正常情况下,我们的程序是自上而下的逐行执行,执行到最后一行才会终止程序的执行.而异常的情况会导致我们的程序半途而废停止了执行.一般情况下的停止执行都是因为我们的程序出错而

  • Python学习之异常处理的避坑指南

    目录 finally与return的执行顺序 else与return的执行顺序 总结 最终想了想,还是把这个章节单独拎出来,虽然字数不多. 在代码中,存在return也应当执行finally: 存在return时,else是不执行的: 无return时,else正常执行: 如果发生异常,则else也不执行 finally 与 return 的执行顺序 示例代码如下: class Test(object):     def division(self, num1, num2):         t

随机推荐