前言

运行程序时经常遇到各种错误,例如:ImportError(导入模块错误)、IndexError(索引错误)、NameError(变量错误)、SyntaxError(语法错误)、IndentationError(缩进错误)等,你或许有许多疑问,为什么程序出现这个错误就会打印出相应的错误信息,自己是否可以编写一个错误呢?这些错误在Python中其实是异常,正确的处理异常会让程序跑起来得心应手,那么怎么来处理异常呢?Here we go!

Python异常

1.1 异常的名词解释

异常其实是一个Python对象,当Python无法正常处理程序时,就会实例化这个对象,从而抛出异常(表示一个错误)

1.2 异常捕捉

当程序出现异常时,如果不处理则会终止程序的运行,如果不想在发生异常时终止程序,则需要使用try来捕捉它,先来看最简单的使用方法:

 name = 'MinuteSheep' # 初始化变量name
print(name) # 将变量name打印出来 print(age) # 将变量age打印出来,并没有初始化age,会抛出变量错误异常 # 运行结果:
MinuteSheep # 正确打印出name变量
Traceback (most recent call last): # age变量抛出变量错误异常
File "1.py", line 4, in <module>
print(age) # 将变量age打印出来,并没有初始化age,会抛出变量错误异常
NameError: name 'age' is not defined
 name = 'MinuteSheep'
print(name) try: # 使用try捕捉异常
print(age)
except NameError: # 当NameError出现时,执行下列代码块
print('变量错误异常被捕捉')
print(NameError) # 运行结果:
MinuteSheep
变量错误异常被捕捉
<class 'NameError'> # 可以看到当出现NameError时,并没有终止程序,而是执行出现异常时的代码块

从上面的代码可以看到,当开始执行一个try语句时,Python将会在当前程序的上下文做标记,当异常出现时,返回这里,执行异常时的代码块,当然也可以捕捉多个异常:

 Traceback (most recent call last):
name = 'MinuteSheep'
print(name) try:
print(age)
except NameError:
print('我是NameError')
except KeyError:
print('我是KeyError') # 运行结果:
MinuteSheep
我是NameError

长上面代码可以看出,当有多个except语句时,会从第一个except语句开始匹配,如果匹配到则执行对于的代码块,剩下的except语句则不运行。多个异常的捕捉这样写会使代码变得冗长,为了简化代码也可以这样写:

 try:
print(age)
except (NameError, KeyError): # 将所有异常放在一行一起处理
print('异常被正确捕捉') # 运行结果:
异常被正确捕捉 # 这样写可以使代码轻量化,但是缺点就是不能单独的处理每一个异常,只能一起处理

有时候需要将异常打印出来,但是异常通常是一个很长的单词,可以使用as给异常起别名:

 try:
print(age)
except NameError as e: # 给异常起一个别名
print('我是NameError')
print(e) # 将这个异常打印出来 # 运行结果:
我是NameError
name 'age' is not defined

1.3 异常的其他语法

其他语法一:

 try:
try代码
except:
except代码
else:
else代码

解释:先执行try代码,当try代码出现异常时,执行except代码;当try代码没有异常时,执行else代码,看例:

 try:
print(age)
except NameError as e:
print(e)
else:
print('没有出现异常哦') # 运行结果:
name 'age' is not defined # 出现异常,执行except代码块,不执行else代码块
 age = 100

 try:
print(age)
except NameError as e:
print(e)
else:
print('没有出现异常哦') # 运行结果:
100
没有出现异常哦 # 没有出现异常,则执行else代码块

其他语法二:

 try:
try代码
except:
except代码
else:
else代码
finally:
finally代码

解释:不管是否有异常,最后都执行finally代码,看例:

 try:
print(age)
except NameError as e:
print(e)
else:
print('没有出现异常')
finally:
print('最后都得执行我') # 运行结果:
name 'age' is not defined
最后都得执行我

Python异常中,最常使用的就是try......except......,else和finally语句并不常见

1.4 异常种类

常见的异常种类:

SystemExit                   解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

可以看到上面这么多异常,怎么可以记得住啊!!!其实,Python中,所有异常都有一个共同的基类BaseException,它包含所有的异常,常规异常的基类是Exception

当不清楚会出现什么异常的时候,直接捕捉Exception基本上都是可以捕捉到的:

 try:
print(age)
except Exception as e: # 使用常规异常的基类
print(e) # 运行结果:
name 'age' is not defined

1.5 主动出发异常

异常可以使用raise主动触发,看例:

 try:
raise Exception('主动抛出异常') # 使用raise主动触发异常
except Exception as e:
print(e) # 运行结果:
主动抛出异常

1.6 自定义异常

Python中所有的异常的基类都是BaseException,常见的异常的基类是Exception,那么自己如果想要自定义异常的话,也要以BaseException或者Exception为基类(关于类的讲解以后会介绍到,这里先看一看)

class MSException(Exception):
def __init__(self, content):
¦ self.content = content def __str__(self):
¦ return self.content try:
raise MSException('这是MinuteSheep自定义的异常') # 抛出自定义异常
except Exception as e:
print(e) # 运行结果:
这是MinuteSheep自定义的异常

1.7 断言

这是一个新名词,断言是个什么鬼呢?断言是用来检测条件是否正确的。有这么一句话:与其让程序在运行时出错,不如让其出现错误条件时出错。断言语句的关键字为:assert

基本用法:assert 条件

当条件正确时,什么也不返回;当条件错误时,抛出AssertionError

In [5]: assert 9>5    # 条件正确时,什么也不返回

In [6]: assert 9<5   # 条件错误时,抛出AssertionError
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-6-739be7e04005> in <module>
----> 1 assert 9<5 AssertionError:

断言的错误可以自己填写,用法:assert 条件,'错误信息'

In [7]: assert 9<5, 'Error!!!!!'   # 自己填写错误信息
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-7-ea55b9c82b31> in <module>
----> 1 assert 9<5, 'Error!!!!!' AssertionError: Error!!!!!

Python异常到此结束

#21 Python异常的更多相关文章

  1. Python异常和异常处理

    Python异常和异常处理2017年12月20日 22:17:08 Megustas_JJC 阅读数:114 标签: python 异常处理 更多 个人分类: Python 版权声明:本文为博主原创文 ...

  2. python 异常

    引用一段来自菜鸟教程的文章:http://www.runoob.com/python/python-exceptions.html Python 异常处理 python提供了两个非常重要的功能来处理p ...

  3. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  4. python——异常except语句用法与引发异常

    except: #捕获所有异常 except: <异常名>: #捕获指定异常 except:<异常名1,异常名2):捕获异常1或者异常2 except:<异常名>,< ...

  5. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

  6. python异常捕获异常堆栈输出

    python异常捕获异常堆栈输出 学习了:https://blog.csdn.net/chris_grass/article/details/77927902 import traceback def ...

  7. 小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)

    小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理) 异常处理(处理) 1.产生异常.raise 异常类(),抛出异常2. 处理异常: try: xxxxx # 尝试执行的代码. ...

  8. python 异常之进阶操作

    1.文件分析 下面来做一些文件分析操作,分析整本书的信息. 知识点: string.split():将字符串分解为列表. open(filename,‘rb’)或者open(filename,enco ...

  9. Python异常类型及包含关系

    Python异常类型及包含关系,设计异常捕获时参考: BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- ...

随机推荐

  1. elasticsearch中 refresh 和flush区别(转)

    elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...

  2. c刷题

    1.转义字符: C中定义了一些字母前加 "\" 来表示常见的那些不能显示的ASCII字符,如\0 空字符,\r 回车, \n换行等,就称为转义字符,因为后面的字符,都不是它本来的A ...

  3. [swarthmore cs75] Compiler 6 – Garbage Snake

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第9次大作业. 赋值的副作用:循环元组 下面的代码展示了Python3是如何处理循环列表(pri ...

  4. Excel把数据存入共享字符串文件中并返回该字符串的下标

    public static int InsertSharedStringItem(string text, pkg.SharedStringTablePart shareStringPart) { i ...

  5. 架构(二)Maven安装以及Nexus配置

    一 Maven安装配置 1.1 下载 http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-ma ...

  6. Reids学习1 -- 初识Redis

    1. Reids和其他类型数据库对比 名称 类型 数据库存储选项 查询类型 附加功能 Redis 使用内存存储的非关系数据库 字符串,列表,集和,散列表,有序集合 每个类型有自己的专属命令,还有批量操 ...

  7. 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存

    一   变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof     ...

  8. [转] XEN, KVM, Libvirt and IPTables

    http://cooker.techsnail.com/index.php/XEN,_KVM,_Libvirt_and_IPTables XEN, KVM, Libvirt and IPTables ...

  9. C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)

    前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...

  10. ubuntu垃圾文件清理方法

    linux和windows系统不同,linux不会产生无用垃圾文件,但是在升级缓存中,linux不会自动删除这些文件,今天就来说说这些垃圾文件清理方法. 1,非常有用的清理命令:sudo apt-ge ...