Python-20-异常处理
一、什么是异常
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)
常用异常:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
二、异常处理
1. 如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防
AGE=10
while True:age=input('>>: ').strip()if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的age=int(age)if age == AGE:print('you got it')break
2. 如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
#基本语法为
try:被检测的代码块
except 异常类型:try中一旦检测到异常,就执行这个位置的逻辑
#举例
try:f=open('a.txt')g=(line.strip() for line in f)print(next(g))print(next(g))print(next(g))print(next(g))print(next(g))
except StopIteration:f.close()
三、抛出异常
在Python中使用raise语句抛出一个指定的异常,我们可以使用类或实例参数调用raise语句引发异常。实例如下:
class EvaException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msgtry:
raise EvaException('类型错误')
except EvaException as e:
print(e)
四、捕捉多个异常
我们前面说了怎么处理一个异常的情况,如果涉及到多个,我们该怎么处理那?
在Python中支持一个try/except语句处理多个异常,语法如下:
try:
<语句>
except <异常名字>:
print(‘异常说明’)
except <异常名字>:
print(‘异常说明’)
try语句的工作方式如下:首次执行try中语句块,如果没有发生异常,则忽略except中的字句,try语句中的代码块执行后结束。如果try语句中的代码块出现异常,try中的剩余语句则会被忽略,
如果异常和eccept中的异常名字一直,相应的except语句就会被执行。如果一个异常也没有匹配,这个异常就会传递给上层的try语句中,一个语句可能包含第一个except语句,
分别处理不同的异常,但是最多只有一个分支会执行。
try:
#a
#1/0
dic = {1:2}
dic[3]
except NameError:
print('名字没有定义,报错了')
except ZeroDivisionError:
print('0不能当做除数,报错了')
except KeyError:
print('没有这个key')
五、异常种的else
我们如果程序执行完异常后还想做其他的事情怎么办?这时我们就可以用到异常中的else了,具体语法如下:
try:
<语句>
except <异常名字> :
<语句>
except <异常名字>:
<语句>
else:
<语句> #(try语句中没有异常后执行此段代码)
如果在try语句中执行没有发生异常,就会执行else语句,使用else语句比把所有语句都放在try字句里面更好,这样可以避免一些意想不到的而except有没有捕获到的异常:
def func(x,y):
try:
a = x/y
except :
print('Error,happened')
else:
print('It went as execpt')
func(2,1)
六、用户自定义的异常
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)try:
raise MyError(2*2)
except MyError as e:
print('My exception occurred, value:', e.value)My exception occurred, value: 4
raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
main__.MyError: 'oops!'
在这个例子中,类 Exception 默认的 __init__() 被覆盖。当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:class Error(Exception):
"""Base class for exceptions in this module."""
passclass 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 = messageclass 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
大多数的异常的名字都以"Error"结尾,就跟标准的异常命名一样。
七、定义清理行为(finally)
try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
以上例子不管 try 子句里面有没有发生异常,finally 子句都会执行。如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出。下面是一个更加复杂的例子(在同一个 try 语句里包含 except 和 finally 子句):>>> def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
预定义的清理行为
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:for line in open("myfile.txt"):
print(line, end="")
以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:with open("myfile.txt") as f:
for line in f:
print(line, end="")
以上这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。
#1 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
s1 = 'hello'
try:int(s1)
except IndexError as e: # 未捕获到异常,程序直接报错print e#2 多分支
s1 = 'hello'
try:int(s1)
except IndexError as e:print(e)
except KeyError as e:print(e)
except ValueError as e:print(e)#3 万能异常Exception
s1 = 'hello'
try:int(s1)
except Exception as e:print(e)#4 多分支异常与万能异常
#4.1 如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么骚年,大胆的去做吧,只有一个Exception就足够了。
#4.2 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。#5 也可以在多分支后来一个Exception
s1 = 'hello'
try:int(s1)
except IndexError as e:print(e)
except KeyError as e:print(e)
except ValueError as e:print(e)
except Exception as e:print(e)#6 异常的其他机构
s1 = 'hello'
try:int(s1)
except IndexError as e:print(e)
except KeyError as e:print(e)
except ValueError as e:print(e)
#except Exception as e:
# print(e)
else:print('try内代码块没有异常则执行我')
finally:print('无论异常与否,都会执行该模块,通常是进行清理工作')#7 主动触发异常
try:raise TypeError('类型错误')
except Exception as e:print(e)#8 自定义异常
class EgonException(BaseException):def __init__(self,msg):self.msg=msgdef __str__(self):return self.msgtry:raise EgonException('类型错误')
except EgonException as e:print(e)#9 断言:assert 条件
assert 1 == 1
assert 1 == 2#10 总结try..except1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;
python标准异常
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
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 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
转载于:https://www.cnblogs.com/lsf123456/p/11207257.html
Python-20-异常处理相关推荐
- 简单介绍Python中异常处理用法
这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...
- python 多进程异常处理
前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重' ...
- Python 多进程异常处理的方法,你会吗
最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重'的功能 ...
- python画图小猪佩奇_吊炸天!Python 20秒画出小猪佩奇
原标题:吊炸天!Python 20秒画出小猪佩奇 今年社交平台上的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇. 小猪佩奇在构图基本是各种曲线,类抛物线.类圆.类椭圆.类二 ...
- python的异常处理及异常类定义
python的异常处理及异常类定义 参考文章: (1)python的异常处理及异常类定义 (2)https://www.cnblogs.com/summer-cool/p/3885581.html 备 ...
- [再学Python] - 3 - 异常处理 try…except…
异常处理语句的简介和语法 Python使用异常处理语句,可使程序不因运行错误而崩溃 try-except-为主要框架,辅以else和finally关键字 try体内如果无异常产生,则执行else内的语 ...
- python中什么是异常,python中异常处理,python异常处理,什么是异常?异常是一
python中异常处理,python异常处理,什么是异常?异常是一 什么是异常? 异常是一个事件,该事件会在程序的执行中发生,影响程序的正常运行,一般情况下,在python无法正常处理程序时,就会发生 ...
- python基础编程之 7-2 python的异常处理机制
7-2 python的异常处理机制 Date: 2021-06-13 Author: SunnyChou 异常处理 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行. python提 ...
- python画小猪佩奇视频_用 Python 20 秒画完小猪佩奇“社会人”!附效果视频+完整代码...
原标题:用 Python 20 秒画完小猪佩奇"社会人"!附效果视频+完整代码 导读:今年社交平台上最火的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇. ...
- Python之异常处理语句
Python之异常处理语句 一.前言 二.try-except 语句 三.try-except-else 语句 四.try-except-finally 语句 五.使用raise 语句抛出异常 一.前 ...
最新文章
- 实现一个完美符合Promise/A+规范的Promise
- MyEclipse默认编码为GBK,修改为UTF8的方法
- TEASOFT辅助服务程序UDPCopy 功能介绍
- esxi安装ghost win7_针对Win7远程桌面的攻击实践(完美)
- ztree实现左边动态生成树,右边为具体信息功能
- Keil MDK-ARM下载 安装与和谐教程
- c++基本类型c++string与c风格字符串的相互转化
- ASP.NET Core 2调用Azure云上的PowerBI报表展示
- 比特币 源代码_GitHub遭黑客攻击:窃取数百源码并勒索比特币,数量惊人!
- Kotlin 1.2 新特性
- Python 图片与字符串互转
- android源码出现的@字符代表什么意思
- 程序员 45 岁怎么了?!
- FTL(闪存转换层)简单介绍
- SQLite数据库知识
- Android之音频和视频的提取
- html ui动画效果图,20种炫酷的菜单线条动画特效UI设计效果_html/css_WEB-ITnose
- 什么是git 暂存区
- 笔记本链接不上wifi怎么办
- Labview-将控件嵌入表格教程1
热门文章
- H3C Hybrid实验
- C++线程中的几类锁
- 三、K8s常见操作命令
- Kubernetes详解(二十一)——ReplicaSet控制器实战应用
- L2TP详解(五)——Client Initiated隧道和会话建立过程
- 阿里云物联网平台物模型SDK试用
- 郁闷的五角大楼:100亿美元“JEDI”云服务采购,却遭受云厂商和国会的双重抗议...
- 安防智能可视化管理在金融行业的应用
- 基于jsp+servlet图书管理系统之后台用户信息修改操作
- 深入理解BGP的几个路由特性(试读连载六)