在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃;然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程序的有可能发生崩溃的代码增加异常处理,以达到程序稳健运行的目的。

一.异常的概念

一般情况,python无法正常处理程序时,就是会产生异常,举个例子:

1.大家都知道分母不能为0,如果分母为0,程序必然崩溃;

x = 3/0

程序崩溃/报错:ZeroDivisionError: division by zero

2.假如 python文件读写 中,我们讲解了文件的读写操作,如果我们对一个不存在的文件读取内容,程序必然也会崩溃;

# 读取123.txt文件,实际上该文件并不存在
fp =open("123.txt","r") 程序崩溃/报错:FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

对于以上的各种异常情况,我们可以通过 try…except…解决,那么具体有哪些异常能捕获呢?如下所示:

1.BaseException — 所有异常的基类

2.SystemExit — 解释器请求退出

3.KeyboardInterrupt — 用户中断执行(通常是输入^C)

4.Exception — 常规错误的基类

5.StopIteration — 迭代器没有更多的值

6.GeneratorExit — 生成器(generator)发生异常来通知退出

7.StandardError — 所有的内建标准异常的基类

8.ArithmeticError — 所有数值计算错误的基类

9.FloatingPointError — 浮点计算错误

10.OverflowError — 数值运算超出最大限制

11.ZeroDivisionError — 除(或取模)零 (所有数据类型)

12.AssertionError — 断言语句失败

13.AttributeError — 对象没有这个属性

14.EOFError — 没有内建输入,到达EOF 标记

15.EnvironmentError — 操作系统错误的基类

16.IOError — 输入/输出操作失败

17.OSError — 操作系统错误

18.WindowsError — 系统调用失败

19.ImportError — 导入模块/对象失败

20.LookupError — 无效数据查询的基类

21.IndexError — 列中没有此索引(index)

22.KeyError — 映射中没有这个键

23.MemoryError — 内存溢出错误(对于Python 解释器不是致命的)

24.NameError — 未声明/初始化对象 (没有属性)

25.UnboundLocalError — 访问未初始化的本地变量

26.ReferenceError — 弱引用(Weak reference)试图访问已经垃圾回收了的对象

27.RuntimeError — 一般的运行时错误

28.NotImplementedError — 尚未实现的方法

29.SyntaxError — Python 语法错误

30.IndentationError — 缩进错误

31.TabError —  Tab 和空格混用

32.SystemError — 一般的解释器系统错误

33.TypeError — 对类型无效的操作

34.ValueError — 传入无效的参数

35.UnicodeError — Unicode 相关的错误

36.UnicodeDecodeError — Unicode 解码时的错误

37.UnicodeEncodeError — Unicode 编码时错误

38.UnicodeTranslateError — Unicode 转换时错误

39.Warning — 警告的基类

40.DeprecationWarning — 关于被弃用的特征的警告

41.FutureWarning — 关于构造将来语义会有改变的警告

42.OverflowWarning — 旧的关于自动提升为长整型(long)的警告

43.PendingDeprecationWarning — 关于特性将会被废弃的警告

44.RuntimeWarning — 可疑的运行时行为(runtime behavior)的警告

45.SyntaxWarning — 可疑的语法的警告

46.UserWarning — 用户代码生成的警告

二.捕获异常方式

1.捕获所有异常

try:
<代码>
except:
print("异常说明")

示例代码:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com @File:try_except.py
@Time:2019/10/9 21:27 @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
""" try:
x = 3 / 0 # 程序出现异常,不会继续执行后面的代码
print("hello world")
except:
print("异常说明:分母不能为0") print("程序正常结束")

输出结果:

异常说明:分母不能为0
程序正常结束

2.捕获指定异常

try:
< 语句 >
except < 异常名 >:
print('异常说明')

示例代码:

try:
fp = open("123.txt","r") # 程序出现异常,不会继续执行后面的代码
print("hello world")
fp.close()
except IOError:
print("异常说明:文件读取失败") print("程序正常结束")

输出结果:

异常说明:文件读取失败
程序正常结束

3.捕获多个异常

try:
< 语句 >
except < 异常名1 >:
print('异常说明1')
except < 异常名2 >:
print('异常说明2')
except < 异常名3 >:
print('异常说明3')

该种异常处理语法的规则是:

a.执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。

b.如果第一个except中定义的异常名与引发的异常匹配,则执行该except中的语句。

c.如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。

d.如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

示例代码:

try:
fp = open("123.txt","r") # 程序出现异常,不会继续执行后面的代码
print("hello world")
fp.close()
except GeneratorExit:
print("异常说明:GeneratorExit")
except FloatingPointError:
print("异常说明:FloatingPointError")
except OverflowError:
print("异常说明:OverflowError")
except ZeroDivisionError:
print("异常说明:ZeroDivisionError")
except IOError:
print("异常说明:IOError") print("程序正常结束")

输出结果:

异常说明:IOError
程序正常结束

4.万能的异常捕获

try:
< 语句 >
except Exception as e: # 自动识别异常信息,并将异常信息保存在e中
print('异常说明:',e)

示例代码:

try:
fp = open("python.txt","r") # 程序出现异常,不会继续执行后面的代码
print("hello world")
fp.close()
except Exception as e:
print("异常说明:",e) print("程序正常结束")

输出结果:

异常说明: [Errno 2] No such file or directory: 'python.txt'
程序正常结束

5.异常中的 else

如果判断完没有异常之后还想做其他事,就可以使用下面这样的else语句,注意:是在try中没有异常情况下,才会执行else之后的代码。

try:
< 语句 >
except < 异常名1 >:
print('异常说明1')
except < 异常名2 >:
print('异常说明2')
else:
< 语句 > # try语句中没有异常则执行此段代码

示例代码:

try:
print("hello world")
except GeneratorExit:
print("异常说明:GeneratorExit")
except FloatingPointError:
print("异常说明:FloatingPointError")
except OverflowError:
print("异常说明:OverflowError")
except ZeroDivisionError:
print("异常说明:ZeroDivisionError")
else:
print("i love you") print("程序正常结束")

输出结果:

hello world
i love you
程序正常结束

6.异常中的finally

try…finally…语句无论是否发生异常都将会执行最后的代码。

try:
< 语句 >
finally:
< 语句 >

示例代码:

try:
fp = open("python.txt","r") # 程序出现异常,不会继续执行后面的代码
print("hello world")
fp.close()
except Exception as e:
print("异常说明:",e)
finally:
print("finally") # 无论是否发生异常都将会执行最后的代码 print("程序正常结束")

输出结果:

异常说明: [Errno 2] No such file or directory: 'python.txt'
finally
程序正常结束

7.raise主动触发异常

可以使用raise语句自己触发异常,语法如下:

raise [Exception [, args [, traceback]]]

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

try:
raise Exception("raise Exception!") # 触发异常后,后面的代码就不会再执行
print("hello world")
except Exception as e:
print(e)
finally:
print("OK")

输出结果:

raise Exception!
OK

四.重点总结

在python开发中,为了增加程序的健壮性,异常处理try…except…是必须掌握的内容.

猜你喜欢:

1.python文件读写操作

2.python内置函数input/eval

转载请注明:猿说Python » python异常处理

技术交流、商务合作请直接联系博主
扫码或搜索:猿说python
猿说python
微信公众号 扫一扫关注

python 异常处理(25)的更多相关文章

  1. python异常处理(基础)

    之前在学习python的时候有整理过python异常处理的文章,不够简单也不够完整,所以决定再整理一篇,算做补充. http://www.cnblogs.com/fnng/archive/2013/0 ...

  2. Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏

    一个程序要保持稳定运行必须要有异常处理,本文将简单介绍Python中的try-except..异常处理语句的使用. 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个 ...

  3. Python 异常处理--raise函数用法

    raise语句手工引发一个异常: "raise" [expression ["," expression ["," expression]] ...

  4. [Python学习笔记][第八章Python异常处理结构与程序调试]

    1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try: try块 except Exception: except块 try-except-else结构 tr ...

  5. python异常处理try,except,else,finally,raise

    先看下else的使用: try: ... exception: ... else: ... 只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else 再看下finally: final ...

  6. Python 异常处理

    Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...

  7. python异常处理的哲学

    所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...

  8. Python异常处理总结

    一.何谓异常处理 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这 ...

  9. python异常处理与断言以及日志模块

    python异常处理与断言 目录: 1.异常处理 2.断言(assert) 3.日志模块(logging) 4.修改之前的车票信息查询,把日志模块.异常处理加进去 1.异常处理 代码如下: 语法: t ...

随机推荐

  1. GeoIP简介与资源,定位经纬度,获取用户IP

    所谓GeoIP,就是通过来访者的IP,定位他的经纬度,国家/地区,省市,甚至街道等位置信息.这里面的技术不算难题,关键在于有个精准的数据库.有了准确的数据源就奇货可居赚点小钱,可是发扬合作精神,集体贡 ...

  2. Docker Quick Start

    翻译自官方Quick Start: https://hub.docker.com/?overlay=onboarding 以Windows为例 1.下载源码 下载构建第一个容器的所需要的所有的东西 需 ...

  3. 套接字编程简介: IPV4套接字地址结构/ 通用套接字地址结构/ IPV6套接字地址结构/新通用套接字地址结构

    IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中. struct in_addr { in_addr_t ...

  4. CCF 201909-3 字符画

    CCF 201909-3 字符画 题意: 将n * m的RGB图片压缩成q * p的块,每块为该原像素的平均值,我们暂且称之为像素块(代码注释为字符块) . 输入n行m列的RGB图片: 第一行:图片的 ...

  5. virsh使用总结

    做下面操作前先安装这些工具: yum  install  virt-install  libvirt-admin  libvirt-client  libvirt-daemon libvirt主要的配 ...

  6. 第10组 Alpha冲刺(3/4)

    队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 继续学习Android studio和Java 制作登录注册界面前端 展示GitHub当日代码/文档签入 ...

  7. Java常见集合的默认大小及扩容机制

    在面试后台开发的过程中,集合是面试的热话题,不仅要知道各集合的区别用法,还要知道集合的扩容机制,今天我们就来谈下ArrayList 和 HashMap的默认大小以及扩容机制. 在 Java 7 中,查 ...

  8. 关于lct维护动态生成树问题

    水管局长数据加强版 题意是要求维护一棵最小生成树,支持删边操作. 删边操作比较难处理,因为如果删掉树上的边, 很难从已经有备选集合中找出连接不同联通块的最小的边. 然而题目并没有要求在线. 所以离线. ...

  9. js传对象处理

    JSON.stringify(carlist); 需要先将对象进行处理:如果服务端解析异常,可以先将这个值单独解析一次

  10. php – 通过curl从url获取JSON数据

    我试图通过curl连接从URL获取JSON数据.当我打开链接时:它显示{“version”:“N / A”,“success”:true,“status”:true}.现在,我希望获得以上内容. 到目 ...