每次版本结束都描述这着同样的错误,相似的问题,但始终没见解决。所以今天,我就来总结下Python的错误与异常!

异常与错误

错误

  • 语法错误

    可以通过IDE或者解释器给出提示的错误

opentxt('a.jpg','r')

  • 逻辑错误

    语法层面没有问题,但是自己代码的逻辑有问题

if age>18: print('未成年')

异常

多指在程序执行过程中,出现的未知错误,语法和逻辑本身是正确的。可以通过代码进行处理或修复

异常分类

  • 除零异常(ZeroDivisionError):

    1/0

  • 名称异常(NameError):

    if age>5,age未定义

  • 类型异常(TypeError):

     1+'abc'

  • 索引异常(IndexError):

    a=[1,2,3] a[4]

  • 键异常(KeyError):

    a={'a':1,'b':2} a['c']

  • 值异常(ValueError)

    int('abcd')

  • 属性异常(AttributeError)

    name='Dracular' print(name.age)

  • 迭代器异常(StopIteration)

    a=iter([1,2]) print(next(a)) print(next(a)) print(next(a))

  • 系统异常类继承树(BaseException所有内建的异常基类)

    • SystemExit

      由sys.exit(0函数引发,当他不处理时,python解释器退出)

    • KeyboardInterrupt

      当用户中断操作引发(ctrl +c)

    • GeneratorExit

      当调用一种generator的close()方法引发

    • Exception

      所有内置的、非系统退出异常是从该类派生的,因为该类派生所有用户定义的异常

异常处理格式

多种异常捕获

刚才介绍了很多异常的分类,也看到了异常处理的格式,那么针对多种异常如何更简洁的捕获呢?

  • 将多个异常通过元组归类到一起

    except (ZeroDivisionError,NameError) as error:

  • 使用Exception这个基类全部捕获

    except Exception as errorinfo:

使用with处理异常

用于执行一段代码前,进行预处理,执行完成这段代码后,进行清理操作
with content_expression[as target(s)]: withbody

大家用到最多的莫过于在读写文件时,使用with open

为什么说他是一个上下文处理器呢?

首先咱们在文件读写的时候主要分三个步骤:

  1. 打开文件

  2. 操作文件的内容

  3. 关闭文件

正常情况下,我们使用的方式为:

那么如果我们在操作文件的时候,出现了异常导致系统退出,就无法正常的关闭文件

但使用with的上下文管理器,就可以达到异常退出时的清理操作!

可是没有论证,空口在这里吹逼不太好啊,举个例子来验证with自带的异常清理。

先看下这段代码:

我们在写文件的时候,手动触发一个异常,然后在except捕获异常后,去重命名该文件。

然后由于没有正常的关闭,此时你去重命名会给出文件正在占用的提示

那同样的方式,我们使用with操作看看效果:

此时正常执行完成,程序没有抛出异常,为什么?因为在上下文处理器中,with捕获异常后,自动的执行了文件的关闭操作,溜不溜?

上下文管理器原理

所谓上下文管理器的原理,其实就是以下三点

  1. 调用enter 方法,进行预处理操作

  2. 执行用户操作

  3. 调用exit方法,完成清理操作

知道了原理,让我们通过自己编写的上下文管理器,重构一下open的方法,让它装逼即耀眼又安全吧

完美结束….

了解下刚才的__exit__

刚才看到在定义__exit__方法时,自带了三个参数exctype, excval, exc_tb

这是什么呢?分别为:异常类别,异常值,追踪信息,怎么看他的值呢?

把上面代码中raise ValueError改为1/0

在`__exit
`方法中加入print(exc_type, exc_val, exc_tb)

得到如下结果:

<class 'ZeroDivisionError'> division by zero <traceback object at 0x00000000032BADC8>

大家会问到追踪信息是什么呢?其实大家天天见….当你代码错误了,提示哪一行有问题的时候,这个帮你定位的东西,就是追踪信息。

想看到追踪信息需要引入一个模块,traceback

继续在__exit__中添加这两行信息

import traceback

print(traceback.extract_tb(exc_tb))

output:

[('E:/Python/xxxx/b.py', 21, '<module>', 'raise ValueError')]

上面个list什么意思呢?错误的文件,错误的行号,文件类型,错误的语句

是不是吊炸天?好了今天就学到这里,碎觉…..

The End

OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。

期待你关注我的公众号清风Python,如果觉得不错,希望能动动手指转发给你身边的朋友们。

作者:清风Python

关于Python中的错误与异常,你是否了解的够仔细?的更多相关文章

  1. Python中的错误和异常

    前言 错误是程序中的问题,由于这些问题而导致程序停止执行.另一方面,当某些内部事件发生时,会引发异常,从而改变程序的正常流程. python中会发生两种类型的错误. 语法错误 逻辑错误(异常) 语法错 ...

  2. Python学习-16.Python中的错误处理

    虽然叫错误,但跟 C# 中的异常是一回事.只不过 Python 中叫错误(Error)而 C# 中叫异常(Exception). 先手工产生一个异常: file = open('','r') 上面一句 ...

  3. python中的捕获异常、异常跟踪

    # 捕获异常,打印异常信息 try: 1/0 except Exception as e: print(e) 输出结果是integer division or modulo by zero,只知道是报 ...

  4. python中try except处理程序异常的三种常用方法

    如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: try: 语句1 语句2 . . 语句N except .........: do somet ...

  5. Python学习_07_错误、异常

    地毯式地过语法终于快要结束了... Python中的常见异常 1.NameError:尝试访问一个未初始化的变量 2. ZeroDivisionError:除数为0 3. SyntaxError:Py ...

  6. Python学习-18.Python中的错误处理(三)

    在某些情况下,我们需要定义自己的异常并且抛出 先定义一个错误: class MyError(BaseException): def __init__(self): pass 上面定义了一个叫MyErr ...

  7. python中若干错误

    今天在运行的django的时候一直提示”系统错误“,如下 except Exception, ex: logger.error(printException()) return render_stri ...

  8. Python 中常见错误总结

    IndentationError: unexpected indent Python 中强制缩进,, IndentationError: unexpected indent 缩进错误 这类错误非常常见 ...

  9. php中的错误和异常

    总结: php错误不会抛出异常,因此不能被catch,但会根据配置写入日志文件或者输出到浏览器,所以可以通过日志文件查看错误 php异常都必须自己抛出,并通过catch捕捉.SQL语句执行的错误好像可 ...

随机推荐

  1. 八、springboot 简单优雅的通过docker-compose 构建

    前言 这个项目有一段时间没有更新了,不过我可没有偷懒哟,是偷偷准备了一个大招,现在是时候展示啦哈哈. 我们今天要做的,就是将我们的项目通过docker-compose 构建成镜像运行.为什么要这样做呢 ...

  2. Java自动化测试框架-12 - TestNG之xml文件详解篇 (详细教程)

    1.简介 现在这篇,我们来学习TestNG.xml文件,前面我们已经知道,TestNG就是运行这个文件来执行测试用例的.通过本篇,你可以进一步了解到:这个文件是配置测试用例,测试套件.简单来说,利用这 ...

  3. Scrapy进阶知识点总结(三)——Items与Item Loaders

    一.Items 抓取的主要目标是从非结构化源(通常是网页)中提取结构化数据.Scrapy蜘蛛可以像Python一样返回提取的数据.虽然方便和熟悉,但Python缺乏结构:很容易在字段名称中输入拼写错误 ...

  4. egret常用功能

    egret常用功能<pre>//////////////////////////////////////////////////////////////////////////////// ...

  5. python函数的基本语法<一>

    函数: 一次定义,多次调用,函数可以变相看成变量函数的阶段: 1.定义阶段 2调用阶段 形参和实参: 定义阶段的参数叫形参,调用阶段的参数叫实参 函数的几种基本用法: #多变量 def test(na ...

  6. pat 1006 Sign In and Sign Out(25 分)

    1006 Sign In and Sign Out(25 分) At the beginning of every day, the first person who signs in the com ...

  7. ASP.NET购物车Cookie获取,创建,添加,更新,删除的用法

    #region 添加购物车 public void GetShoppingCart(int skuId, int quanlity) { HttpCookie cookie = HttpContext ...

  8. webpack安装与核心概念

    安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...

  9. JMeter从0开始-笔记

    1.安装Jmeter之前 安装Jmeter之前需要先配置Java环境,我们下载的是jmeter4.0,所以java版本最好是选用java8以上的版本. 安装JDk1.6的步骤如下: 点击下载的JDK文 ...

  10. hopper逆向的伪代码令人大跌眼镜

    网上介绍hopper有逆向伪代码的文章很多,并以为其是万能而且cool B的.但是并没有人去求证hopper的逆向伪代码参考系数(参考价值,大家做过开发都清楚明白,有些功能看起来很花很cool但不实用 ...