【说明】我们在写python程序时往往为了考虑程序的健壮性通常会考虑到程序执行过程中遇到什么样的异常,出现这样的错误代表着什么,我们可以提前捕获这些个错误方便我们进行处理,python在实际应用中通过try与except来实现异常的处理:
python中try/except/else/finally语句的完整格式如下所示:
(ps:测试代码为Python3.7.4)

try:Normal execution block
except A:Exception A handle
except B:Exception B handle
except:Other exception handle
else:if no exception,get here
finally:print("finally")

语句逻辑意义:

说明:
正常执行的程序在try下面的Normal execution block执行块中执行,在执行过程中如果发生了异常,则中断当前在Normal execution block中的执行跳转到对应的异常处理块中开始执行;
python从第一个except X处开始查找:
如果找到了对应的exception类型则进入其提供的exception handle中进行处理,
如果没有找到则直接进入except块处进行处理。
except块是可选项,如果没有提供,该exception将会被提交给python进行默认处理,处理方式则是终止应用程序并打印提示信息;

如果在Normal execution block执行块中执行过程中没有发生任何异常,则在执行完Normal execution block后会进入else执行块中(如果存在的话)执行。
无论是否发生了异常,只要提供了finally语句,以上try/except/else/finally代码块执行的最后一步总是执行finally所对应的代码块。

ATTENTION PLEASE:
1.在上面所示的完整语句中try/except/else/finally所出现的顺序必须是try–>except X–>except–>else–>finally,即所有的except必须在else和finally之前,else(如果有的话)必须在finally之前,而except X必须在except之前。否则会出现语法错误。
2.对于上面所展示的try/except完整格式而言,else和finally都是可选的,而不是必须的,但是如果存在的话else必须在finally之前,finally(如果存在的话)必须在整个语句的最后位置。
3.在上面的完整语句中,else语句的存在必须以except X或者except语句为前提,如果在没有except语句的try block中使用else语句会引发语法错误。也就是说else不能与try/finally配合使用。

【try-except处理常见异常分类】

  • 单个异常处理
    -语句:
try:statements   #处理的语句
except  Error1 as e:   #遇到Error1执行下面的语句,在python2中写成except  Error1,eprint(e)

eg1:

try:db = pyodbc.connect(r'DRIVER={SQL Server Native Client 10.0};'r'SERVER=(local);'r'DATABASE=test;UID=ssa;PWD=726803')
except pyodbc.InterfaceError as err: #抓取pyodbc.InterfaceError这个异常大类中的错误信息种类并打印print(err)#err是错误的详细信息
#输出
('28000', "[28000] [Microsoft][SQL Server Native Client 10.0][SQL Server]用户 'ssa' 登录失败。 (18456) (SQLDriverConnect); [28000] [Microsoft][SQL Server Native Client 10.0][SQL Server]用户 'ssa' 登录失败。 (18456)")
  • 处理多个异常
    -语句:
方式1:
try:code
except Error1 as e:  #处理Error1异常print(e)
except Error2 as e:   #处理Error2异常print(e)方式2:
try:code
except (Error1,Error2,...) as e:print(e)

注:第二种写法的用处:括号里面的所有错误,不管出现里面任何一种错误都用统一的处理方法。
eg2:

name = [1,2,3]
data = {"a":"b"}
try:data["c"]   # 这边已经出现异常KeyError ,所以直接跳出code,跳到KeyError 下去处理name[3]
except IndexError as e:print(e)
except KeyError as e:print(e)#输出
'c'

【Exception实现所有异常处理】

-语句:

try:code
except (Error1,Error2,...) as e:print(e)
except Exception as e:  print(e)# 说明 用Exception表示一下子抓住所有异常,这个一般情况下建议在异常最后面用,用在最后抓未知的异常

eg3:

try:open("qigao.text","r",encoding="utf-8")
except (IndexError,KeyError) as e:   #没有IndexError,KeyError这两个异常print(e)
except Exception as e: print(e)# 没有IndexError,KeyError这两个异常只能通过 Exception 这个异常处理,来抓住所有的异常
#输出
[Errno 2] No such file or directory: 'qigao.text'

【else没有异常发生,执行else部分的codes】

try:print("A")    #代码没有异常
except (IndexError,KeyError) as e:print(e)
except Exception as e:print(e)
else:             #没有异常出错,走else的逻辑代码print("没有异常")#输出
A
没有异常

【finnally最后执行】

try:code
except (Error1,Error2,...) as e:print(e)
except Exception as e:print(e)
else:print("没有错误,执行")
finnally:print("不管有没有错,都执行finnally")
  • 无异常情况
try:print("A")  #没有异常
except (IndexError,KeyError) as e:print(e)
except Exception as e:print(e)
else:print("没有异常")
finally:print("不管有没有错,都这行finnally")
#输出
A
没有异常
不管有没有错,都这行finnally
  • 有异常情况
try:data = {"a":"b"}data["c"]   #data字典中没有'c'这个key值
except (IndexError,KeyError) as e:print(e)
except Exception as e:print(e)
else:print("没有异常")
finally:print("不管有没有错,都这行finnally")
#输出
'c'
不管有没有错,都这行finnally

【 自定义异常】

  • 定义异常类
class MyError(Exception):  #定义一个异常类MyError,继承Exceptiondef __init__(self,message):self.message = messagedef __str__(self):return self.message #给对象取一个名
  • 触发自定义异常
    我们可以使用raise语句自己触发异常
    raise语法格式如下:
     raise [Exception [, args [, traceback]]]

语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

try:raise MyError("数据库未成功连接")           #触发自定义异常,MyError("数据库未成功连接")这个对象
except MyError as e:print(e)#输出
数据库未成功连接

【写在后面】
说了这么多若果您还没看太懂那就直接自己试一下这个案例吧

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import xlsxwriter
import xlrdworkbook = xlsxwriter.Workbook('C:\\Users\\Elink 001\\Desktop\\tabletest.xls')
worksheet = workbook.add_worksheet('table')
workbook.close()workbook1 = xlrd.open_workbook(r'C:\Users\Elink 001\Desktop\tabletest.xls')
sh = workbook1.sheet_by_name('table')rows = sh.row_values(1)  # 第2行内容
cols = sh.col_values(0)  # 第1列内容
print("cols, rows", cols, rows)# 获取单元格内容
print(" 第1行第1列数据", sh.cell(0, 0).value)
  • step1:当我们执行以上代码后会生成一个表格
    手动添加以下数据:(1列3行,python默认row索引为0-2,col索引为0)

    在上述代码后添加一行:
    print(" 第4行第1列数据", sh.cell(3, 0).value) #(显然这个cell的数据并不存在)

执行后Python提示:
IndexError: list index out of range

  • step2.加入try-except
#!/usr/bin/python3
# -*- coding: utf-8 -*-import xlsxwriter
import xlrd# workbook = xlsxwriter.Workbook('C:\\Users\\Elink 001\\Desktop\\tabletest.xls')
# worksheet = workbook.add_worksheet('table')
# workbook.close()workbook1 = xlrd.open_workbook(r'C:\Users\Elink 001\Desktop\tabletest.xls')
sh = workbook1.sheet_by_name('table')rows = sh.row_values(1)  # 第2行内容
cols = sh.col_values(0)  # 第1列内容
print("cols, rows", cols, rows)# 获取单元格内容
print("第1行第1列数据", sh.cell(0, 0).value)  # 第1行第1列数据i = 2
k = 0try:test1 = sh.cell(0, 3).valueif i > 1:k = 1
except IndexError:print("array index out of range")print("第1行第1列数据", sh.cell(0, 0).value)j = 2print("j = ", j)
print("k = ", k)

实验结果:

说明:
我认为try-except 的学习好比C语言中的if-else语法结构。即当我们将对于可能出错的代码放在try包含的内容中执行,如果发生错误,系统制动检测except中是否有设置好的错误分类,如果try执行结果的错误类型属于except错误类型,则执行except块语句,执行完之后再执行整个try-except之后的语句块:
本例中

i = 2
k = 0try:test1 = sh.cell(0, 3).valueif i > 1:k = 1
except IndexError:print("array index out of range")print("第1行第1列数据", sh.cell(0, 0).value)j = 2print("j = ", j)
print("k = ", k)
  • 当我们code执行到try:之后检测到 sh.cell(0, 3).value值并不存在, (k = 1没有执行,k仍然保持k = 0)
  • code自动跳转到except中,
  • except包含的错误类“IndexError”刚好包含try语句执行的错误类型“IndexError:list index out of range”,
  • 所以执行except中的两个print语句,并对K重新赋值为2
  • 接着执行try-except之后的语句

对于此处try-except的学习分享有任何不准确的地方希望大家多多交流,谢谢!

Python之try except异常处理工作机制和案例解析相关推荐

  1. python反射实例化_Python类反射机制使用实例解析

    这篇文章主要介绍了Python类反射机制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 反射就是通过字符串的形式,导入模块:通过字符串的 ...

  2. 真实工作经验总结——案例解析企业选型操作步骤

    这是一个融合了本人以前工作经验的案例,包含有多个企业的选型需求.选型的过程也参考了本人以前所经历的部分事实.展现的目的在于让PUBer看到一个相对真实的选型. 企业介绍 这是一家中型的电脑和周边设备生 ...

  3. python查找字符串关键词_Python字符串查找基本操作案例解析

    本篇文章小编给大家分享一下Python字符串查找基本操作案例解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 字符串查找基本操作主要分为三个关键词:fi ...

  4. Python+SQL实战:京东用户行为数据分析案例解析(下)

    freedom_lime | 作者 掘金 | 来源 https://juejin.im/post/6844904202590748679#heading-0 4. 用户行为转化漏斗 # 导入相关包 f ...

  5. 深入对比数据科学工具箱:Python和R的异常处理机制

    概述 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件).Python和R作为一门编程语言自然也是有各自的异常处理机制的,异常 ...

  6. Kubernetes Eviction Manager工作机制分析

    2019独角兽企业重金招聘Python工程师标准>>> 研究过Kubernetes Resource QoS的同学,肯定会有一个疑问:QoS中会通过Pod QoS和OOM Kille ...

  7. VM结构、GC工作机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 题外话:最近在应聘阿里2015暑期实习,感触颇多.机会总是留给有准备的人的,所以平常一定要注意知识的巩固和积累.知识的深度也要 ...

  8. AsyncTask工作机制简介

    昨天写的图片的三级缓存,假设有兴趣,能够去看下,浅谈图片载入的三级缓存原理(一) http://blog.csdn.net/wuyinlei/article/details/50606455 在里面我 ...

  9. 学python好找工作嘛-Python开发学完好找工作吗?

    原标题:Python开发学完好找工作吗? Python开发学完好找工作吗?这就要看看Python的发展前景了.那么,python前景当然不错,数据分析.机器学习.爬虫.运维.Web,都是很好的方向-- ...

最新文章

  1. android测量的三种模式
  2. 史上最简单粗暴获取阿里巴巴iconfont图标,并引用到vant的方法(没有之一)
  3. 如何使用ui-router中的ui-sref将参数传递给控制器
  4. 解决 echarts柱状图x轴数据隔一个显示
  5. CentOS7安装Zabbix
  6. 初步了解Linux strace 命令和跟踪进程产生的系统调用
  7. Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)
  8. openssl+poly1305+sm4实现
  9. 算法试题 - 找出字符流中第一个不重复的元素
  10. python闭环最短路径_深度学习经典算法 | 蚁群算法解析
  11. matlab如何使用cu文件,Matlab编译cuda的.cu文件
  12. 吴恩达深度学习CNN作业:Convolutional Neural Networks: Application
  13. Python之路:初识
  14. 医疗中的ai_医疗保健中自主AI的障碍
  15. 前端可视化的四种方式
  16. IDEA左侧,按照文件夹排序
  17. 双软企业两免三减半政策
  18. 通用 OCR API 接口
  19. 仪表板工具Stimulsoft Dashboards中的面板组件介绍
  20. 数据结构实训-纸牌游戏

热门文章

  1. 我在实际工作中用的最多的 git 命令,全在这里了,使用简单!
  2. 基于 Redis 实现的分布式锁
  3. 信息系统项目管理知识--软件工程
  4. 05-JDBC学习手册:JDBC2.0 新特性之批量处理数据
  5. java web start error_java web start——启动文件错误,没法启动指定应用程序这个问题如何解决?谢谢...
  6. python开发的模型部署_使用Python部署机器学习模型的10个实践经验
  7. 第一个Hadoop程序——WordCount
  8. 简单示例,VS2019调试C语言程序
  9. tinyxml语法讲解之写xml
  10. 笔记 - Ali Cloud网络(VPC, SLB) 简介