专栏首页python3python 异常

python 异常

python的异常分为两种,1)、语法错误,在python解释器的语法检测中不通过不能运行代码    2)、异常,python程序运行期检测到的错误被称为异常。在没有做异常处理时,将终止程序并提示异常信息,如:①字符串转换为数字时的类型转换异常,②文件读取时的文件不存在异常,③网络链接时主机不可达异常···等。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。毕竟谁也不希望用着的程序突然的就崩了

1、语法错误

python的语法错误是很多初学者经常遇到的一个问题,这类错误比较低级,只要多敲几遍代码就可以减少这样的错误

 1 >>> if Trur
 2   File "<stdin>", line 1
 3     if Trur
 4           ^
 5 SyntaxError: invalid syntax
 6 >>> print("as"))
 7   File "<stdin>", line 1
 8     print("as"))
 9                ^
10 SyntaxError: invalid syntax

如:出现这样的错误就是语法错误,第1行结尾if语句缺少 ":",第6行结尾多了 ")" 

2、异常

1)运行期检测到的错误被称为异常,python的语法检测无法检查这样的错误。

1 >>> int("aa")
2 Traceback (most recent call last):
3   File "<stdin>", line 1, in <module>
4 ValueError: invalid literal for int() with base 10: 'aa'
5 >>> f = open("aaa.txt","r")
6 Traceback (most recent call last):
7   File "<stdin>", line 1, in <module>
8 FileNotFoundError: [Errno 2] No such file or directory: 'aaa.txt'

其中第1行,第5行都是出现异常的地方,看一下异常的输出信息,如下图

2)python的标准异常类

BaseException 为所有异常的基类,Exception 为常规错误的基类

其它python的异常类可以到这里看(http://www.runoob.com/python/python-exceptions.html),就不再一一的述说,也可以百度查看

3、异常处理

为了提高程序的健壮性,不让程序出现异常时出现崩溃的情况,在必要时需要进行异常处理

1)try-except:语句

①、最简单的异常处理语句如下,当try的语句块中有异常出现时,下边的的语句将不再执行(第3行),异常被except捕获,执行except中的语句块后继续向下执行程序(如第6行)。注:except后边不跟异常的类型,默认捕捉所有的异常

 1 try:
 2     int("aaa")
 3     print("---aaa---")
 4 except:
 5     print("出现异常-->英文字母不能转换为数字")
 6 print("----------")
 7 
 8 
 9 # 输出结果
10 出现异常-->英文字母不能转换为数字
11 ----------

②、多分支异常,当我们需要捕获不同的异常时可以用多个except来实现,需要获取异常的信息可通过as 变量名得到异常的对象,如第7行

 1 try:
 2     nu = int("100")
 3     print("转换后的值nu:", nu)
 4     i = 1 / 0
 5 except ValueError:
 6     print("出现异常-->英文字母不能转换为数字")
 7 except ZeroDivisionError as e:  # 通过 as 变量名 获取异常的对象
 8     print("出现异常-->除数不能为零")
 9     print("异常的提示信息-->", e)
10 except:
11     pass
12 print("----------")
13 
14 
15 # 输出结果
16 转换后的值nu: 100
17 出现异常-->除数不能为零
18 异常的提示信息--> division by zero
19 ----------

③、当我们需要将多个异常按相同的处理方式可以使用  except (ValueError, [ZeroDivisionError [, NameError]]):

 1 try:
 2     i = 1 / 0
 3     nu = int("aa")
 4 except (ValueError, ZeroDivisionError) as e:
 5     print(e)
 6 except:
 7     pass
 8 print("----------")
 9 
10 
11 # 输出结果
12 division by zero
13 ----------

2)try-except-else-finally 语句

①、当try-except-else-finally中出现了finally语句,不管是否出现异常finally语句块中的语句一定会执行,而else中的语句只有不出现异常是才会执行

出现异常时try-except-else-finally如下

 1 try:
 2     i = 1 / 0
 3     print("没有出现异常i值", i)
 4 except Exception as e:
 5     print("出现异常-->", e)
 6 else:
 7     print("没有出现异常-->执行else")
 8 finally:
 9     print("不管是否出现异常,这里的语句一定会被执行")
10 
11 
12 # 输出结果
13 出现异常--> division by zero
14 不管是否出现异常,这里的语句一定会被执行

没有出现异常时try-except-else-finally如下

 1 try:
 2     i = 1 / 1
 3     print("没有出现异常i值", i)
 4 except Exception as e:
 5     print("出现异常-->", e)
 6 else:
 7     print("没有出现异常-->执行else")
 8 finally:
 9     print("不管是否出现异常,这里的语句一定会被执行")
10 
11 
12 # 输出结果
13 没有出现异常i值 1.0
14 没有出现异常-->执行else
15 不管是否出现异常,这里的语句一定会被执行

②、try-except-else-finally还可以拆开使用,有三种形式 1)try-except-finally   2)try-except-else    3)try-finally。  这里就不展示代码了

4、异常的传递

在发生异常的语句中没有处理异常的语句,异常将向上层传递,直到遇到处理异常的语句,或python解释器终止程序

 1 def test2():
 2     int("aa")
 3 
 4 def test1():
 5     test2()
 6 
 7 try:
 8     test1()
 9 except Exception as e:
10     print(e)
11 print("-----------")
12 
13 
14 # 输出结果
15 invalid literal for int() with base 10: 'aa'
16 -----------

如上test2中第2行出现异常,将向第5行调用test2的语句处传递,这里依旧没有异常处理语句,将继续往上层传递到第8行处被except捕获

5、抛出异常 raise

1)抛出python已定义的异常

通过raise 异常类型即可抛出一个异常,抛出的异常也会被except捕获到。如下边第4行

 1 age = 500
 2 try:
 3     if age < 0 or age > 200:
 4         raise ValueError("age范围0-200")
 5     print("age", age)
 6 except ValueError as e:
 7     print("出现异常-->", e)
 8 
 9 
10 # 输出结果
11 出现异常--> age范围0-200

2)抛出自定义异常

抛出自定义异常首先得有个自定义的异常类,注:自定义的异常必须直接或间接的继承Exception基类

 1 class MyException(Exception):  # 自定义异常类
 2     def __init__(self, msg):
 3         self.msg = msg
 4 
 5 
 6 age = 500
 7 try:
 8     if age < 0 or age > 200:
 9         raise MyException("age范围0-200")  # 抛出自定义异常
10     print("age", age)
11 except MyException as e:
12     print("出现异常-->", e)
13 
14 
15 # 输出结果
16 出现异常--> age范围0-200

当然自定义异常类也可以拥有许多的功能,就得看需求添加啦

 6、在异常处理中抛出异常

 有某需求:当捕获到异常时处理完后想继续抛出异常.....

在except中用raise可以抛出当前异常

 1 try:
 2     i = 1 / 0  # 异常的语句
 3 except Exception as e:
 4     print("出现异常-->", e)
 5     raise  # 处理完后继续抛出异常,raise表示抛出当前异常
 6 print("-------------")
 7 
 8 
 9 # 输出结果
10 出现异常--> division by zero
11 Traceback (most recent call last):
12   File "<stdin>", line 2, in <module>
13     i = 1 / 0
14 ZeroDivisionError: division by zero

注:异常处理尽量在需要的时候再使用,使用太多会影响代码的可读性

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第七章 Python异常处理

    顾名思义,异常就是程序因为某种原因无法正常工作了,比如缩进错误、缺少软件包、环境错误、连接超时等等都会引发异常。一个健壮的程序应该把所能预知的异常都应做相应的处...

    用户2398817
  • Python学习 :异常处理

      - 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,只与异常处理有关)

    用户2398817
  • python学习之异常处理

    用户2398817
  • Python 学习入门(19)—— 异常

    在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

    阳光岛主
  • 【程序源代码】spring整合activiti流程设计器

    关键字:spring boot 1.5.8整合Activiti6.0及其Activiti-modeler(web版流程设计器)demo

    程序源代码
  • 2018年8月2日魔法方法,异常处理,类属性,类方法,静态方法

    今天遇到的新单词: enterprise n企业 ********************************** 魔法方法; 魔法方法:已经具...

    武军超
  • 关于游戏自动更新工具的思考

    逍遥剑客
  • 关于游戏自动更新工具的思考

    网络游戏的自动更新很频繁,而多数玩家会抱怨下载速度过慢 同样的,如果全部都从游戏提供商的服务器上下载,势必导致网络资源的极大浪费,而且对于企业的更新服务器和带宽...

    逍遥剑客
  • git 入门教程之变基合并 原

    git 鼓励大量使用分支---"早建分支!多用分支!",这是因为即便创建再多的分支也不会造成存储或内存开销,并且分支的作用有助于我们分解逻辑工作,这样一样其实比...

    雪之梦技术驿站
  • gitflow 开发流程学习(第一部分)

    前端正义联盟

扫码关注云+社区

领取腾讯云代金券