python异常处理

添加异常处理代码是为了让程序在遇到异常时能继续执行,
而不是一有异常错误就直接挂了
在无法确定代码是否能够顺利成功执行
或者知道代码可能存在一些错误的时候,需要把异常预先处理好。

try语句块中0作为除数,发生异常

1
2
3
4
try:
x = 1/0
except ZeroDivisionError as err:
print('程序发生异常,错误信息: {}'.format(err))

程序发生异常,错误信息: division by zero

异常处理常用方法

匹配多种异常的两种方法

异常分开写
这里匹配的是:ZeroDivisionError 异常

1
2
3
4
5
6
try:
x = 1/0
except IndexError as err:
print('程序发生 IndexError 异常, 错误信息:{}'.format(err))
except ZeroDivisionError as err:
print('程序发生 ZeroDivisionError 异常,错误信息:{}'.format(err))

程序发生 ZeroDivisionError 异常,错误信息:division by zero

异常代码合起来写,让代码更简洁些

1
2
3
4
try:
x = 1/0
except (IndexError, ZeroDivisionError, FileNotFoundError) as err:
print('程序发生 某种 异常, 错误信息:{}'.format(err))

程序发生 某种 异常, 错误信息:division by zero

异常的超类是:Exception ,捕获一切异常

以下两种写法效果都能捕获异常
区别是第二种简写不能捕获具体为哪种异常,只能笼统的输出异常

1
2
3
4
5
6
7
8
9
try:
x = 1/0
except Exception as err:
print('程序发生 某种 异常, 错误信息:{}'.format(err))

try:
x = 1/0
except:
print('程序发生 某种 异常, 错误信息:')

程序发生 某种 异常, 错误信息:division by zero
程序发生 某种 异常, 错误信息:

finally语句

总会被执行,不管有没有异常发生

1
2
3
4
5
6
try:
x = 1/0
except:
print('程序发生 某种 异常, 错误信息:{}')
finally:
print('一定会被执行的 finally 语句块')

程序发生 某种 异常, 错误信息:{}
一定会被执行的 finally 语句块

else 语句的理解

1
2
3
4
5
6
7
8
9
try:
with open('test.txt') as f:
f.read()
except FileNotFoundError as err:
print('文件不存在,{}'.format(err))
else:
print('文件已打开,可以进一步操作了!')
finally:
print('最后一定会干的事情')

‘test.txt’ 文件不存在的情况

文件不存在,[Errno 2] No such file or directory: ‘test.txt’
最后一定会干的事情

‘test.txt’ 文件存在的情况

文件已打开,可以进一步操作了!
最后一定会干的事情

自定义异常类

由于异常的超类是:Exception
所有自定义的异常类要继承:Exception 基类

直接实例化Exception类抛出异常

1
2
3
4
err = Exception('自己抛出一个异常')
print(err.__sizeof__())
print(err.__str__())
raise err

32
自己抛出一个异常
Exception: 自己抛出一个异常

继承基类Exception,创建自定义异常类

1
2
3
class MyException(Exception):
pass
raise MyException('用自定义的异常类抛出一个异常')

raise MyException(‘用自定义的异常类抛出一个异常’)
main.MyException: 用自定义的异常类抛出一个异常

重写基类init, str

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyError(Exception):
def __init__(self, value):
super(MyError, self).__init__(self)
self.value = value

def __str__(self):
return self.value

try:
error = MyError('自定义异常')
raise error
except MyError as err:
print(err)

自定义异常