目录
1. 错误和异常
1.1 错误
- 通常是使用不正确的语法造成的
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
# SyntaxError: invalid syntax
# if 后面缺少冒号(:)
a = 1
if a==1
print(a)
1.2 异常
- 当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
# ZeroDivisionError: division by zero
a = 10 / 0
print(a)
# TypeError: can only concatenate str (not "int") to str
b = '2' + 2
print(b)
2. 处理异常
2.1 try...except
- 把可能出现问题的代码,放在try中
- 把处理异常的代码,放在except中
try
语句的工作原理如下:
- 首先,执行 try 子句 (
try
和except
关键字之间的(多行)语句)。 - 如果没有异常发生,则跳过 except 子句 并完成
try
语句的执行。 - 如果在执行 try 子句时发生了异常,则跳过该子句中剩下的部分。 然后,如果异常的类型和
except
关键字后面的异常匹配,则执行 except 子句,然后继续执行try
语句之后的代码。 - 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的
try
语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如下所示的消息。
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
try:
print('-----test--1---')
open('123.txt', 'r')
print('-----test--2---')
except IOError:
print('这是发生异常后处理的代码!')
2.2 except捕获多个异常
- 使用:把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
try:
print('-----test--1---')
open('123.txt', 'r') # 如果123.txt文件不存在,那么会产生 IOError 异常
print('-----test--2---')
print(num) # 如果num变量没有定义,那么会产生 NameError 异常
except (IOError, NameError):
print('这是发生异常后处理的代码!')
- 注:如果发生的异常和
except
子句中的类是同一个类或者是它的基类,则异常和 except 子句中的类是兼容的(但反过来则不成立 --- 列出派生类的 except 子句与基类不兼容)
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
# 下面的代码将依次打印 B, B, B
for cls in [B, C, D]:
try:
raise cls()
except B:
print("B")
except C:
print("C")
except D:
print("D")
# 下面的代码将依次打印 B, C, D
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
2.3 捕获所有异常
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
try:
print(num) # 如果num变量没有定义,那么会产生 NameError 异常
except Exception:
print('这是发生异常后处理的代码!')
2.4 获取异常信息
- 注:谨慎使用,因为以这种方式很容易掩盖真正的编程错误!它还可用于打印错误消息,然后重新引发异常
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
try:
print(num) # 如果num变量没有定义,那么会产生 NameError 异常
except NameError as e:
print('这是发生异常后处理的代码!')
print(e) # 打印异常信息
2.5 else
子句
- 未发生异常时,执行else子句
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
try:
num = 100
print(num)
except NameError as e:
print('产生错误了:%s' % e)
else:
print('未发生异常时的逻辑代码')
2.6 finally
子句
- 不论
try
语句是否产生了异常都会被执行
4种特殊情况:
- 如果在执行
try
子句期间发生了异常,该异常可由一个except
子句进行处理。 如果异常没有被某个except
子句所处理,则该异常会在finally
子句执行之后被重新引发。 - 异常也可能在
except
或else
子句执行期间发生。 同样地,该异常会在finally
子句执行之后被重新引发。 - 如果在执行
try
语句时遇到一个break
,continue
或return
语句,则finally
子句将在执行break
,continue
或return
语句之前被执行。 - 如果
finally
子句中包含一个return
语句,则返回值将来自finally
子句的某个return
语句的返回值,而非来自try
子句的return
语句的返回值。
# -*- coding: utf-8 -*-
# @Time : 2021/2/9
# @Author : 大海
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
divide(2, 1)
divide(2, 0)
divide("2", "1")