1. 错误类型
IndexError:list index out of range #下标越界
ZeroDivisionError:division by zero #分母为0
TypeError: can only concatenate str (not "int") to str #类别错误(即不同的类型进行加减之类的操作)
AttributeError:'list' object has no attribute 'find' #用做字符串的函数用在列表中
FileNotFoundError: [Errno 2] No such file or directory: 'd:\\\\pythoncode\\hello.py' #文件处理相关的错误
KeyError: 'nam' #键查找的错误
这些错误的名称最好有一定了解,方便我们对一些异常的指定查找有一定的帮助
-
异常处理结构
-
try和except
try是对异常信息的检测,而except则是对异常信息的捕获并处理
-
对于一般的异常信息可以
try:
AAA
except:
XXX
-
对于指定想要报错的信息时可以把异常类型放expect后面
try:
XXX
except ___Error: #这里填的是异常类型
XXX
-
如果是针对多个指定的错误的信息时,并输出一个结果时可以把多个类型用()括起来,让他们构成元组
try:
XXX
except (IndexError,ZeroDivisionError):
XXX
这样只要是这两个异常语句的其中之一时,都会执行expect下面的语句
-
当然,可以多个expect放在一起并用,那样就类似于多个if条件句
try: XXX except IndexError: XXX except ZeroDivisionError: AAA
这样当异常为IndexError时,会执行下面的XXX,而当异常为ZeroDivisionError时,会执行下面的AAA
-
当你想要了解你的异常信息时可以
try:
XXX
except as e:
print(e)
XXX
这样就会把异常类型对应的信息传递给e
-
也可以用else针对try的语句没有报错时执行一些信息(这里的except就类似于if,当出现对应的异常时except执行,否则是else执行)
try:
AAA
except:
XXX
else:
BBB
-
当然还有一个finally针对于无论是否报错都会执行(个人感觉其实有没有问题不大,毕竟反正都会执行)
try:
AAA
except:
XXX
else:
BBB
finally:
CCC
-
当然对于多个try在一起时,如果里面的异常except没有检测出来,会返回给它的上一层,,如下所示
try: try: try: a=input() a=int(a) except ZeroDivisionError: print('最里层') # print(1/0) except: print('中间一层') except: print('最外层')
这里的ZeroDivisionError是指分母为0,而当我们输出非数字时a=int(a)会抛出异常,毕竟非数字类型不能用int,此时的错误类型为ValueError,因此最里层的except检测不出来,然后把它传递给中间一层,因此输出结果为中间一层,当然如果最里层的except对应的也有异常,那么它还是会传递给中间一层
-
当然,如果你想人为抛出异常,可以用raise,一般raise有三种用法
-
只含raise
>>> raise Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: No active exception to reraise
这种直接抛出RuntimeError异常,并返回对应异常信息
-
raise+你指定的一个异常类型
>>> raise ValueError Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError
这样只会抛出一个ValueError名为ValueError,但并没有对应的异常信息
-
raise+你指定的一个异常类型+异常信息
>>> raise ValueError("输出错误")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 输出错误
这样会附带异常信息
-
raise一般和try等一起连用,比如当你想要你输入的数小于100,否则会抛出"你输入的数必须得小于100"(这里只考虑输入的为数)
try:
a=int(input())
if(a>=100):
raise ValueError('你输入的数必须小于100')
except ValueError as e:
print(e)
else:
print(a)