异常处理

一、错误和异常

程序中难免出现错误,而错误分为两种:语言异常和逻辑异常

  1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)

for i in range(5)
print(i)

  2.逻辑错误

#类型错误
num = input(">>>")
int(num) res = 1/0
res1 = 1+ 'str'

异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下:

  python中有很多不同的异常种类,python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误

例如:

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError 试图访问字典里不存在的键

TypeError 传入对象类型与要求的不符合

二、异常处理

1、什么叫异常处理

  python解释器检测到错误,触发异常(也允许程序员自己触发异常)

  程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)。如果捕捉成功则进入另外一个处理分支,执行你为其定制的处理逻辑,使程序不会崩溃,这就是异常处理。

  因为python解析器去执行程序,检测到了一个错误时,会触发异常,异常触发之后且在没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行。就会导致运行的软件崩溃。而异常处理机制就是间接的增强程序的容错性,让程序遇到错误时不会停止,软件正常运行,而不是崩溃。

2、怎么处理异常

  首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正

  处理异常有两种方式:1、用if判断;2、try: 代码段 except 异常: 处理方式

1、用if判断

l = [1,2,3,4,5]
if len(l) >1000: #条件不满足,跳过
print(l.index(1000))
else:
print(l[4])

总结:

  1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。

  2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,就像是在你的代码中到处插代码,直接导致可读性极其的差。

  3.if是可以解决异常的,只是存在1,2的问题。所以,千万不要妄下定论if不能用来异常处理。

2、try: 代码段 except 异常: 处理方式    Exception 万能异常,捕捉所有异常

  python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

1)基本语法:

try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑

  2)异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

try:
print("")
print("")
print(x)
print("")
print("=====")
except NameError as x:
print(x)
print("继续执行其他操作!") #执行结果:
11111
22222
name 'x' is not defined
继续执行其他操作!

  3)不同类型的异常类可以同时存在,构成多分支结构!

try:
print("")
print("")
print(x)
print("")
print("=====")
except ValueError as x:
print(x)
except KeyError as y:
print(y)
except NameError as z:
print(z)
print("继续执行其他操作!")

  4)万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任何异常。

try:
print("")
print("")
print(x)
print("")
print("=====")
except ValueError as x:
print(x)
except KeyError as y:
print(y)
except Exception as z: #捕获其他任何异常
print(z)
print("继续执行其他操作!")

  5)异常的其他机构

try:
print("=---->")
print(x)
print("-=--->")
except NameError as x:
print(x)
except Exception as y:
print(y)
else:
print("try内代码块没有异常则执行!")
finally:
print("无论异常与否,都会执行该模块,通常是进行清理工作")
print("继续执行其他操作!") #执行结果:
=---->
name 'x' is not defined
无论异常与否,都会执行该模块,通常是进行清理工作
继续执行其他操作!

  6)主动触发异常

  7)自定义异常(由于异常是类,自定义异常类的时候,需要继承基类-万能异常)

#_*_coding:utf-8_*_

class AlexException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg try:
raise AlexException('类型错误')
except AlexException as e:
print(e)

  8)断言  assert 条件

x = 1
y = 1
assert x == y #x = y 判断对就执行,不对就抛异常
print('=-====>')
y = 2
assert x == y #判断 对就执行,不对就抛异常
print('=-====>')

总结:

  什么是异常,异常就是错误引发的结果

  什么是处理,由于异常带来的是程序崩溃,处理的目的就是让程序在异常后跳转到其他逻辑去执行,不让程序崩溃

  if 和 try...excpet都可以进行异常处理判断, 只不过if是针对一种异常的多分支,针对不同段代码的同种类型错误,你需要重复写多分支if,而try是针对不同类型异常的多分支,可以把不同段代码放到一起,检测他们的同种类型错误。

  过多的使用某个处理异常的方式,就会直接导致程序可读性及其的差。所以要分清情况再选择处理异常的方式。try...except应该尽量少用,因为它本身就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的。只有在有些异常无法预知的情况下,才应该加上try...except,其他的逻辑错误应该尽量修正

归纳总结:

一、异常处理
分成两种:一种是由语法上的错误引发的异常;
另外一种是逻辑上的错误引发的异常。
对于语法上的异常:应该是在程序执行前就改正;
对于逻辑上的错误,尽量使用if来预防异常;
对于逻辑上无法预知的错误,应该用try...except...去处理
语法:
try:
被监测的代码块
except 异常类型 as e:
print(e)
except Exception as e: #万能异常
pass
else:
没有异常时触发
finally:
有没有异常都触发

#自定义异常:
class MyException(BaseException):
pass
#主动抛异常:
raise Type('异常值')
#断言 程序运行到这一步,进行判断,然后在再执行。
assert 1 == 1 assert 1==2

注意点:不要把异常处理作为编程逻辑错误的尚方宝剑,能少用尽量少用。

Py修行路 python基础 (二十二)异常处理的更多相关文章

  1. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

    一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...

  2. Py修行路 python基础 (十四)递归 及 面向对象初识及编程思想

    一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件 ...

  3. Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  4. Py修行路 python基础 (十六)面向对象编程的 继承 多态与多态性 封装

    一.继承顺序: 多继承情况下,有两种方式:深度优先和广度优先 1.py3/py2 新式类的继承:在查找属性时遵循:广度优先 继承顺序是多条分支,按照从左往右的顺序,进行一步一步查找,一个分支走完会走另 ...

  5. Py修行路 python基础 (十八) 反射 内置attr 包装

    一.isinstance 和 issubclass1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象.2.issubclass(sub, super)检查sub类是否是 ...

  6. Py修行路 python基础 (十九)面向对象进阶(下)

    item系列 __slots__方法 __next__ 和 __iter__实现迭代器  析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的格式.  例如:对象名['key'] ...

  7. Py修行路 python基础 (十)装饰器

    装饰器 一.定义 装饰器:顾名思义,就是对某个东西起到装饰修饰的功能. python中的装饰器,其本质上就是一个python函数,它可以让其他函数在不需要任何代码变动的前提下增加额外功能.通俗理解就是 ...

  8. Py修行路 python基础 (二十五)线程与进程

    操作系统是用户和硬件沟通的桥梁 操作系统,位于底层硬件与应用软件之间的一层 工作方式:向下管理硬件,向上提供接口 操作系统进行切换操作: 把CPU的使用权切换给不同的进程. 1.出现IO操作 2.固定 ...

  9. Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块

    一.前提介绍: 可以开辟作用域的只有类,函数,和模块            for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...

随机推荐

  1. 最详细的虚拟机安装centos7教程

    参考网站:https://jingyan.baidu.com/article/b7001fe1d1d8380e7382dd72.html 安装vmware10,vmware是收费的,作为学习,我介意还 ...

  2. 最大流EK算法/DINIC算法学习

    之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点 ...

  3. OpenStack Mitaka HA部署方案(随笔)

    [Toc] https://github.com/wanstack/AutoMitaka # 亲情奉献安装openstack HA脚本 使用python + shell,完成了基本的核心功能(纯二层的 ...

  4. 25-THREE.JS 绘制线框样式几何图形的材质 线材质

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  5. 【51nod-1046】最大子矩阵和

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值.   例如:3*3的矩阵:   -1 3 -1 2 -1 3 -3 1 2   和最大的子矩阵是:   3 ...

  6. Activiti 教程

    Activiti入门教程:http://blog.csdn.net/column/details/activitizhou.html Activiti 5.15 用户手册:http://www.cnb ...

  7. L137

    Uncontacted Tribes at Risk Amid ‘Worrying' Surge in Amazon Deforestation Illegal loggers and militia ...

  8. New Concept English three (29)

    1听力和打字训练: 31w/m 54 typing errors Whether we find a joke funny or not largely depends on were we have ...

  9. New Concept English three (43)

    30 54 Insurance companies are normally willing to insure anything. Insuring public or private proper ...

  10. 一个css3 旋转效果 -- 待续

    <div class="container"> <div> <figure></figure> <figure>< ...