python在程序运行出现错误时时有相应的反应机制 ,我们可以针对不同的错误做出不同的响应

 list1 = ['a','b','c']
print(list1[4]) #>>>IndexError: list index out of range
a = {"name":"Jack",
"age":22}
print(a["sex"]) #KeyError: 'sex'

例子中分别指出了两个错误:IndexError和KeyError。如果我们想对程序中是否出现了这种错误,可以抓取出来。下面我们就针对这两种错误举例

 list1 = ['a','b','c']
a = {"name":"Jack",
"age":22}
try:
list1[2]
a["sex"] #这里是有错的!
except IndexError as e:
print("列表操作错误",e)
except KeyError as e:
print("没有这个key",e)

当try里的代码出现错误的话,通过except把错误获取

C:\Users\Aaron\Anaconda3\python.exe D:/python/week7/错误处理.py
没有这个key 'sex'

运行结果

这样就会得到了,可是如果会有很多种错误的话,每种错误都加个except也太麻烦了!就可以这么写:

 list1 = ['a','b','c']
a = {"name":"Jack",
"age":22}
try:
list1[5] #这里是有错的!
a["sex"] #这里是有错的!
except (IndexError,KeyError) as e:
print("错误!",e)

但又出了个问题,用这种写法的话当出现错误,不能很好的显示错误的种类例子中两个条件都是错误的,只能显示成

C:\Users\Aaron\Anaconda3\python.exe D:/python/week7/错误处理.py
错误! list index out of range

运行结果

所以这种方式是不推荐使用的!可是既然可以这么写,是不是有其他的作用呢?这时需要一个另外的用法——万能异常:Exception,可以把所有的错误抓取。这时候就可以做排除已知错误外的所有未知错误。

 list1 = ['a','b','c']
a = {"name":"Jack",
"age":22}
try:
list1[2]
a["name"]
open("没有这个文件.txt")#这里是有错的!
except IndexError as e:
print("列表操作错误",e)
except KeyError as e:
print("没有这个key",e)
except Exception as e:
print("未知错误",e)

在前面的错误类型都没有的话,可以显示最后的错误!

C:\Users\Aaron\Anaconda3\python.exe D:/python/week7/错误处理.py
未知错误 [Errno 2] No such file or directory: '没有这个文件.txt'

运行结果

总而言之,一般的异常处理结构是这样的:

 list1 = ['a','b','c']
a = {"name":"Jack",
"age":22}
try:
list1[2]
a["name"]
open("没有这个文件.txt")#这里是有错的!
except (IndexError,KeyError) as e:
print("列表操作错误",e)
except KeyError as e:
print("没有这个key",e)
except Exception as e:
print("未知错误",e)
else:
print("一切正常")
finally:
print("无论是否发生异常,这里的代码都要执行")

我们现在看一看常用的异常代码

AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

对了,还有一种异常处理在程序调试中可以用到:触发异常:

 try:
raise KeyError
except KeyError as e:
print("没有这个Key",e)

在try中加入 raise,可以通过代码直接触发异常

最后,还有一种异常的用法:自定义异常

 class concect_Error(Exception):
def __init__(self,msg):
self.msg = msg
try:
raise concect_Error("数据库连接失败")
except concect_Error as e:
print(e)

要注意的是,在定义错误的类中,一定要继承Exception的属性。自定义的类是属于Exception这个大类的!

Python 之异常处理机制的更多相关文章

  1. python的异常处理机制

    异常机制己经成为衡量一门编程语言是否成熟的标准之一,使用异常处理机制的 Python 程序有更好的容错性,更加健壮. 对于计算机程序而言,情况就更复杂了一一没有人能保证自己写的程序永远不会出辛苦!就算 ...

  2. [python]python try异常处理机制

    #python的try语句有两种风格 #一:种是处理异常(try/except/else) #二:种是无论是否发生异常都将执行最后的代码(try/finally) try/except/else风格 ...

  3. Python的异常处理机制 -- (转)

    当你的程序中出现异常情况时就需要异常处理.比如当你打开一个不存在的文件时.当你的程序中有一些无效的语句时,Python会提示你有错误存在. 下面是一个拼写错误的例子,print写成了Print.Pyt ...

  4. python异常处理机制

    python有五种异常处理机制,分别是 1.默认异常处理器. 如果我们没有对异常进行任何预防,那么程序在执行过程中发生异常就会中断程序,调用python默认的异常处理器,并在终端输出异常信息,如图所示 ...

  5. Python笔记(四):异常处理机制与 open()

    (一)  异常处理机制概述 就像日常生活中会遇到各种意外情况一样(例如:你可能考虑过如果中了500w该怎么做),代码运行过程中也会遇到这种意外情况,python提供了这么一种机制,处理意外情况(就像如 ...

  6. python正确使用异常处理机制

    一.不要过度使用异常 不可否认,Python 的异常机制确实方便,但滥用异常机制也会带来一些负面影响.过度使用异常主要表现在两个方面: 把异常和普通错误混淆在一起,不再编写任何错误处理代码,而是以简单 ...

  7. python基础-异常处理

    一.错误和异常 程序中难免出现错误,而错误分成两种 1.1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def te ...

  8. python的异常处理

    在所有的程序中,都会遇到异常,有些异常是代码编写的时候产生的,在前期过程中可能会直接导致程序无法运行.这一类的异常,在编写代码的时候,程序可以直接排查修改.但有些异常,是在程序运行过程中产生的,可能是 ...

  9. python的反射机制

    转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...

随机推荐

  1. dropload插件的使用(上拉下滑加载数据)

    .导入 js dropload.min. js zepto.min.js  <!-- jQuery1.7以上 或者 Zepto 二选一,不要同时都引用 --> $(function(){ ...

  2. Link & Redirect

    [Link] Link标签,用于实现React-Router功能的跳转.(意思是就不要使用a标签了) 1)to:string,指明要跳转的path. import { Link } from 'rea ...

  3. Pandas文本操作之读取操作

    读写文本格式的数据 pandas中的解析函数 函数 说明 read_csv 从文件.url.文件型对象中加载带分隔符的数据,默认分隔符为逗号 read_table 从文件.url.文件型对象中加载带分 ...

  4. oracle 查询列表中选取其中一行

    select k.SAL from (select SAL,rownum rn from (select SAL from SCOTT.EMP where MGR = 7698 order by SA ...

  5. leetcode 数组类型题总结

    1,removeDuplicates(I) int removeDuplicatesI(vector<int>& nums){ // 重新组织数组,同 removeDuplicat ...

  6. 全国绿色计算大赛 模拟赛第一阶段(C++)第1关:求和

    挑战任务 这次“绿盟杯”大赛,小明作为参赛选手在练习的时候遇到一个问题,他要对一个范围的两个数进行数位的累加,例如有两个数 15,19 则 他们的数位和应该为:1+5+1+6+1+7+1+8+1+9, ...

  7. 缩点+最小路径覆盖 hdu 3861

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题意:输入t,表示t个样例.接下来每个样例第一行有两个数n,m表示点数和有向边的数量,接下来输入 ...

  8. Django 之多对多关系

    1. 多对多关系 作者 <--> 书籍 1. 表结构设计 1. SQL版 -- 创建作者表 create table author( id int primary key auto_inc ...

  9. HDU-2612.Find way .(不同起点不同终点的BFS)

    我要被这个好用的memset气死了...... 真香 #include <cstring> #include <string> int main () { ]; memset( ...

  10. Unity3D游戏贪吃蛇大作战源码休闲益智手机小游戏完整项目

    <贪吃蛇大作战>一款休闲竞技游戏,不仅比拼手速,更考验玩家的策略. 视频演示: http://player.youku.com/player.php/sid/XMzc5ODA2Njg1Ng ...