异常:
在我们平常用Python写程序的过程中,即便程序的语法是正确的,在运行它的时候,也有可能发生错误,运行期检测到的错误被称为异常,
当异常出现时,程序的运行会被中断
异常展示:
大多数的异常都不会被程序处理,以下是常见的一些异常类型:
ImportError:无法引入模块或包。
IndexError ----->下标错误
list1 = ['a','b','c']
print(list1[3])
# ModuleNotFoundError ----> 模块未被发现错误
import day14.package03.mod2
NameError:使用一个还未被赋予对象的变量。
SyntaxError:代码逻辑语法错误。
TypeError -----> 类型错误
s = 4 + sum * 3
print(s)
ValueError:传入一个不被期望的值,即使类型正确。
KeyError:试图访问你字典里不存在的键。
IOError:输入输出异常。文件操作。
# ZeroDivisionError ---除数为零
a = 10 / 0
print(a)
异常处理:
try/except
try 语句按照如下方式工作;
-
首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
-
如果没有异常发生,忽略 except 子句,try 子句执行后结束。
-
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
-
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
捕捉全部的异常类型 (方法一)
a = 3
b = 0
try:
a / b
except :
print("b 不能为 0")
print("无论如何都会执行")
以上实例打印结果:
b 不能为 0
无论如何都会执行
捕捉全部的异常类型 (方法二)
a = 3
b = 0
try:
a / b
except Exception as err:
print(err)
print("b 不能为 0")
print("无论如何都会执行")
Exception:指的就是全部异常类型
err 打印出来的就是错误的类型
捕获指定的异常
如果捕获指定异常,错误的类型是所指定的异常的话,程序会正常运行,如果错误类型不是指定的话,那么程序继续报错。
报错的情况:
except指定的异常类型应该是 ZeroDivisionError,但是他却指定了KeyError,所以报错
a = 3
b = 0
try:
a / b
except KeyError:
print("b 不能为 0")
print("无论如何都会执行")
不报错的情况:
a = 3
b = 0
try:
a / b
except ZeroDivisionError:
# print(err)
print("b 不能为 0")
print("无论如何都会执行")
捕获多个异常
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
a = 3
b = 0
try:
# 可能发生异常的代码
list1=[1,2,3][6]
c=a / b
except ZeroDivisionError as err:
print(err)
print("记录")
except IndexError as err:
print(err)
print("赶紧联系开发。")
print("无论如何都会执行")
try/except...else
try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。
else 子句将在 try 子句没有发生任何异常的时候执行。
使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。
异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。
例如:
def add(a, b):
if isinstance(a, int) and isinstance(b, int):
return a + b
else:
print(ValueError("数据类型不对"))
add("3",4)
以上实例运行结果:
数据类型不对
分组捕获
异常也可以分组。
例如:
a=6
b=0
try:
# 可能发生异常的代码
lst = [1,2]
lst[100]
# [1,2][100]
a / b
except (ZeroDivisionError, IndexError) as err:
print(err)
print("记录")
except (KeyError, ValueError) as e:
print("赶紧联系开发")
# except IndexError as err:
# print(err)
# print("赶紧联系开发。")
无论如何都会执行,不管有没有捕获到 except
finally:
finally:
# 无论如何都会执行,不管有没有捕获到 except
# 文件,关闭
print("无论如何都会执行的操作")
with open("file") as f: #随时随地都会关闭文件,就是从finally演变过来的
pass
# try:
# f = open()
# except:
# 错误逻辑
# finally:
# f.close()
try:
pass
except:
pass
else:
# 当 except 没有被触发的时候
# 会执行的代码
pass
主动抛出异常
raise
Python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:raise [Exception [, args [, traceback]]]
例如:
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
以上实例运行结果:
Traceback (most recent call last):
File "test.py", line 3, in <module>
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10
此篇有部分内容借鉴了菜鸟,再此非常感谢菜鸟编程