Published in:2024-10-24 |

异常处理

一、简介

1
2
3
4
5
6
7
1. 异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况.

2. 异常是程序执行过程中,发生了某种‘错误’,影响程序的正常运行. Python程序在执行前有可能会发生语法错误,也会导致程序无法正常执行。
- 运行时错误
- 语法错误

3. 异常处理的目的:通过异常处理,我们可以对程序中出现的意外情况进行处理,防止程序崩溃,增加程序的健壮性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在编程语言处理异常:
1. 使用if判断进行处理
a = 5
b = 0
if b != 0:
print(a / b)
else:
print('除数不能为0')

2. 使用try块处理
a = 5
b = 0
try:
print(a/b)
except:
print('除数不能为0')
# if更适合用于一些可以预判的一种异常情况,但是if不可能把所有的异常情况都判断到,有些异常是我们无法预知

二、常见的异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
异常分类:(1)语法错误 (2)运行时错误
1. NameError: 名字异常
变量未定义,直接去使用 NameError: name 'a' is not defined

2. IndentationError: 缩进错误
在同一个代码块中,使用了不同的缩进

3. SyntaxError:语法错误
1a = 5 变量名不能以数字开头

4. TypeError: 类型错误
print(1+'1') 字符串和Int类型不能直接相加

5. ZeroDivisionError:除数为零错误
10/0 ZeroDivisionError: division by zero

6. FileNotFoundError: 文件未找到错误
读文件时,文件不存在

7. StopIteration:迭代器异常
next()调用次数超过了元素的个数

8. KeyError:键错误
访问字典不存在的键 d[key]

9. ValueError: 值错误
print(int('abc')) 将字符串强制转为int

10. AttributeError:属性错误
访问对象中不存在的属性或方法时

11. indexError:下标(越界)异常
下标超出范围

12. RecursionError:递归异常
递归超过最大深度

以上的异常类型都是由类定义的

13. Exception: 常见的错误异常的基类(父类)

14. BaseException:所有异常的基类

三、处理异常

一般情况下,Python无法正确处理/执行程序时,就会发生(抛出)一个异常.

异常是一个对象,表示一个错误.

当Python程序发生异常时,我们就需要捕获并处理它,否则程序会终止执行(崩溃).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. try-except
try:
可能出现异常的代码
except:
所有的异常都会在这里处理(全捕获)

try:
可能出现异常的代码
except 异常类型 as 变量名:
只有匹配异常类型时,才会执行except (精准匹配)

# 注意:如果发生了异常,异常后面的代码不会被执行
try:
10/0
print('go on') # 这行代码不会被执行
except:
xxx

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 全匹配
try:
10/0
# print([][1])
except :
print('发生了错误')


# 精准匹配
try:
10/0
# print([][1])
except IndexError as e:
print('发生了错误')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2. try-except-except
try:
可能出现异常的代码
except 异常类型1 as e:
该类型的异常处理
except 异常类型2 as e:
另一种类型的异常处理
except:
xxx
# 注意:通用性最高的要放最后面,匹配性最高的要放最前面

try:
10/0
# print([][1])
# print(int('abc'))
except Exception as e: # 这里的except往后放 通用性强
print('发生下标越界错误',e)
except ZeroDivisionError as e:
print('发生了除数为零的错误',e)
except:
print('未知类型的异常')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 多个except后面接异常类型
try:
# 10/0
print([][1])
except IndexError as e:
print('发生下标越界错误',e)
except ZeroDivisionError as e:
print('发生了除数为零的错误',e)

# 在最后,加except不加异常类型:用于匹配其它情况(相当于if..elif..elif..else中的else)
try:
# 10/0
# print([][1])
print(int('abc'))
except IndexError as e:
print('发生下标越界错误',e)
except ZeroDivisionError as e:
print('发生了除数为零的错误',e)
except:
print('未知类型的异常')
1
2
3
4
5
6
7
3. try-except-except-else
try:
可能出现异常的代码
except Exception as e:
print(e)
else:
print('如果没有发生异常则执行else')

示例:

1
2
3
4
5
6
7
8
9
10
11
12
import traceback

try:
# 可能出现异常的代码
a = int(input('输入a:'))
b = int(input('输入b:'))
print(a / b)
except:
print('出错了')
traceback.print_exc()
else:
print('这是else')
1
2
3
4
5
6
7
8
9
10
11
12
13
4. try-except-except-finally
- 不论代码是否出现异常,都会执行finally

import traceback

try:
a = int(input('输入a:'))
b = int(input('输入b:'))
print(a / b)
except:
traceback.print_exc()
finally:
print('最终~~~~')

四、自定义异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyException(BaseException):
def __init__(self, msg):
self.__msg = msg

def __str__(self):
return self.__msg


try:
a = int(input('输入a:'))
b = int(input('输入b:'))
if b == 1:
# 什么时候抛出异常,以及什么是异常由程序员来决定
raise MyException('除数不允许为1')
else:
print(a / b)
except MyException as e:
print(e)
Prev:
Next: