try…except

1
2
3
4
5
try:
result = 1 / 0
print(result)
except ArithmeticError:
print("数学错误") # 数学错误
  • 基础的一个处理方式
1
2
3
4
5
6
7
try:
result = 1 / 0
print(result)
except ArithmeticError as e:
print("数学错误") # 数学错误
print(type(e)) # <class 'ZeroDivisionError'>
print(e) # division by zero
  • 可以通过as关键字拿到异常对象做处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try:
result = 1 / 0
print(result)
except ZeroDivisionError:
print("0不能作为除数")
except ArithmeticError:
print("数学错误")
print("结束")

try:
result = 1 / 0
print(result)
except ArithmeticError:
print("数学错误")
except ZeroDivisionError:
print("0不能作为除数")
print("结束")
  • 注意异常对象之间的继承关系,子类的异常会被父类捕获
  • 异常捕获从上到下,被捕获后就跳出了,所以不要把子类异常放到父类异常后面,当然IDE也会有语法提示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try:
result = 1 / 0
print(result)
except TypeError:
print("运行出错了")
except ZeroDivisionError:
print("运行出错了")
except ValueError:
print("运行出错了")

try:
result = 1 / 0
print(result)
except (TypeError, ZeroDivisionError, ValueError):
print("运行出错了")
  • 如果有多个异常的处理方式相同可以直接把异常对象放到元组中
1
2
3
4
5
6
7
8
try:
result = 1 / 0
print(result)
except (TypeError, ValueError):
print("类型错误或值错误")
# except:
except Exception:
print("其它错误")
  • 最后接一个Exception或者直接except来捕获所有异常

else从句

如果没有异常发生则会执行的逻辑

finally从句

无论什么情况下都需要执行的逻辑

raise

1
2
3
4
try:
raise ZeroDivisionError('0不能作为除数')
except ZeroDivisionError as err:
print(err)
  • 手动抛出异常

自定义异常

1
2
3
4
5
6
7
8
9
10
class MyException(Exception):
def __init__(self, msg1, msg2):
self.msg1 = msg1
self.msg2 = msg2


try:
raise MyException('123', 'abc')
except MyException as err:
print(err)

获取异常信息

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
import sys
import traceback

def f1():
print(1 / 0)

def f2():
try:
f1()
except ZeroDivisionError:
ex_type, ex_value, ex_traceback = sys.exc_info()

print('异常的类型:%s' % ex_type)
print('异常的错误信息:%s' % ex_value)
print('异常调用堆栈的跟踪信息:%s' % ex_traceback)

tb = traceback.extract_tb(ex_traceback)
print(tb)

for filename, linenum, funcname, source in tb:
print('文件名:%s' % filename)
print('行数:%s' % linenum)
print('函数名:%s' % funcname)
print('源码:%s' % source)

f2()