一.引入:
Python是解释型语言,会整体扫描一下代码,如果有语法错误,则整个程序完全不会执行。如下:
def myfun():
print('哈哈哈哈哈哈哈')
print(‘嘻嘻嘻嘻')#这里是中文的括号
print('嘿嘿')
myfun()
没有语法错误的时候一行行检查,直到扫描到其他错误的位置,停止执行。(在扫描到错误之前正确的代码还是会执行的)如下:
def myfun():
print('哈哈哈哈哈哈哈')
b = 'hello' + 15#类型错误
print(b)
print('嘿嘿')
myfun()
python中所有的异常都是继承自BaseException,分为四大类:
类型 | 描述 |
SystemExit | python退出异常 |
Keyboardlnterrupt | 键盘打断(ctrl + c) |
GeneratorExit | 生成器退出 |
Exception | 普通异常 |
二.异常
三.try......except捕获异常:
try:
with open('a.txt','r') as f:
f.read()
except: #在pycharm中会有波浪线,因为没有加具体的异常
print('没有找到又怎么样呢?')#当a.txt不存在时会打印
#运行结果:
没有找到又怎么样呢?
当try中的代码没有报错时,except就不会执行,当try中的代码出错时,会执行except中的代码
try:
a = 0
b = 1/a
except:
print('没写错!')
捕获具体的异常:
try:
with open('a.txt','r') as f:
f.read()
except FileNotFoundError:#增加了具体的异常类型
print('没有找到又怎么样呢?')#当a.txt不存在时会打印
当增加了a = 0, b = 1/a这个错误的时候,在with之后,它不会被捕捉到,因为with已经出错,直接执行except;如果a = 0, b = 1/a,放在with之前,则会报错
try:
with open('a.txt','r') as f:
f.read()
a = 0
b = 1/a
except FileNotFoundError:
print('没有找到又怎么样呢?')#当a.txt不存在时会打印
#运行结果
没有找到又怎么样呢?
再增加一个异常:
try:
a = 0
b = 1 / a
with open('a.txt','r') as f:
f.read()
except FileNotFoundError:
print('没有找到又怎么样呢?')#当a.txt不存在时会打印
except ZeroDivisionError:
print('这是分母为0的一个错误')
#运行结果
这是分母为0的一个错误
捕获多种异常:
try:
raise TypeError('嘿嘿嘿,这是一个类型错误') #主动抛出一个异常
except FileNotFoundError:
print('没有找到又怎么样呢?')#当a.txt不存在时会打印
except ZeroDivisionError:
print('这是分母为0的一个错误')
except Exception as e:
print(e)#打印出主动抛出的异常
主动抛出异常:
def myfunc(num):
if type(num) != int:
raise TypeError('不是数字')
return num * 10
print(myfunc('hello'))
运行结果:
四.更加丰富的结构
try:
except...:
else...: 在没有错误的时候执行
finally: 无论如何都会执行
当报错时:
def myfunc(num):
if type(num) != int:
raise TypeError('不是数字')
return num * 10
try:
print(myfunc('hello'))
except TypeError:
print('代码出错了')
else:
print('代码没有报错')
finally:
print('不管怎样,我finally都会执行')
#运行结果
代码出错了
不管怎样,我finally都会执行
没有报错时:
def myfunc(num):
if type(num) != int:
raise TypeError('不是数字')
return num * 10
try:
print(myfunc(10))
except TypeError:
print('代码出错了')
else:
print('代码没有报错')
finally:
print('不管怎样,我finally都会执行')
#运行结果
100
代码没有报错
不管怎样,我finally都会执行
五.断言
不使用断言:
if not False:
raise Exception('条件不满足')
使用断言:
assert True #不抛出异常
assert False #抛出异常
例:
def myfunc(num):
assert type(num) == int #相当于 if type(num) != int: raise TypeError('不是数字')
return num * 10
print(myfunc('hello'))
运行结果:
六.自定义异常类型
class NameMustBeNanBeiError(Exception):
pass
def myfunc(name):
if name != '哈哈':
raise NameMustBeNanBeiError('必须要是哈哈哦~')
try:
print(myfunc('嘿嘿'))
except Exception as e:
print(e)
#运行结果:
必须要是哈哈哦~
练习1
如果我用w模式正常的打开了文件,然后write时候如果报错呢?那么我怎么正常关闭文件?
import os
if not os.path.exists('my_tesr.txt'): # 判断文件是否存在
file = open('my_test.txt', 'w+', encoding='utf-8')
try:
my_dict = {'name': 'xiaojiu'}
file.write(my_dict['name'])
except Exception as e:
print(e)
finally:
file.close()
print('文件正常关闭')
# 文件存在则不会运行try