Python学习--Day 17
- 视频来源:python视频 900集
130.异常
- 语法错误和异常
老师讲的、简单的、不正式的理解就是:在pycharm中,没运行的时候看不到,程序运行的时候报出来的xxxError。 - 异常处理:按照如下的格式书写:
try:
可能出现异常的代码
except:
如果有异常执行的代码
[finally:
无论是否存在异常都会被执行的代码] # 可有可无
- 举例:使用
try
将异常可能出现的代码包含在内
def func():
try:
s1 = int(input('please input 1st number:'))
s2 = int(input('please input 2nd number:'))
sum = s1 + s2
print(sum)
except:
pass
func()
- 举例2:出现具体的问题,使用Except将对应的异常类型放在后面,并将代码内容放在里面。
def func():
try:
s1 = int(input('please input 1st number:'))
s2 = int(input('please input 2nd number:'))
sum = s1 / s2
print(sum)
except ZeroDivisionError: # 如果捕捉到了除0错误,就执行
print('ZeroDivisionError')
except ValueError: # 如果捕捉到了输入值类型错误,就执行
print('ValueError')
func()
131.异常之多个excpet
- 异常的归属1:
object——BaseException——Exception——各种Error
如下代码,若出现了ValueError
,会被Exception捕捉,并执行相应的代码。
def func():
try:
s1 = int(input('please input 1st number:'))
s2 = int(input('please input 2nd number:'))
sum = s1 / s2
print(sum)
except ZeroDivisionError: # 如果捕捉到了除0错误,就执行
print('ZeroDivisionError')
# except ValueError: # 如果捕捉到了输入值类型错误,就执行
# print('ValueError')
except Exception:
print('Exception')
func()
- 异常的归属2:
如下代码会有逻辑错误,因为ValueError
已经被前面的Exception
捕捉,后面的ValueError
部分形同虚设。因此Exception
等更高级的父类异常要放在最下面。
def func():
try:
s1 = int(input('please input 1st number:'))
s2 = int(input('please input 2nd number:'))
sum = s1 / s2
print(sum)
except ZeroDivisionError: # 如果捕捉到了除0错误,就执行
print('ZeroDivisionError')
except Exception: # 书写的时候要将最大的父类写在最下
print('Exception')
except ValueError: # 逻辑错误
print('ValueError')
func()
- 异常的归属3:
如果想使用父类的Exception进行异常捕捉,又想让它具体报出错误,可以使用以下代码:
except Exception as err:
____print(err)
会将捕捉到的其他类型的报错原因变为err抛出。
132.try与else
- else内的内容仅仅是当没有出现异常的时候才会被执行,而添加了return会跳过else,因此如果用了
try-else
结构,代码中就不能出现return。
例如如下代码,因为同时使用了try-else和return,else的内容是遥不可及的,永远也不可能到达。
def func():
try:
s1 = int(input('please input 1st number:'))
print(s1)
return 1
except ValueError:
print('必须是数字')
return 2
else: # 在Pycharm中自动变黄色。
print('try - else')
func()
- finally的特点是,无论有没有异常都会执行;else是不报错才进行。文件操作的时候,将close()放在finally中不论是否有异常都会将资源释放。例如报错和文件操作的结合:(以及数据库的close())
try:
文件操作
except:
io异常错误
finally:
stream.close() # 无论是不是有异常,都会将资源释放。
- 当finally和return结合的时候:以如下代码为例:如果有finally,执行完try遇到try内的return,不会返回,而是等待finally执行完,如果finally内有return,就会返回finally内的return值;finally内没有return就返回try中的return值。
def func():
stream = None
try:
stream =open(r'C:\Users\10727\Desktop\q.txt')
context = stream.read()
print(context)
return 1
except Exception as err:
print(err)
return 2
finally:
print('---finally---')
if stream:
stream.close()
return 3
func()
print(func())
# 输出结果是3
# 如果将finally内的return 3语句注释掉,会返回1
133.异常抛出
- 抛出异常,raise,举例:使用
raise
将自己定义的异常抛出:
基本格式:raise 自定义异常/Exception('异常说明')
def register():
username = input('please input your name:')
if len(username)<6:
raise Exception('MUST HAVE SIX OR MORE CHARACTERS')
else:
print('OK!')
register()
- 使用try结合raise,将自定义的异常使用try捕捉。
try:
register()
except Exception as err:
print(err)
print('F')
else:
print('OK')
# 输出结果:
# MUST HAVE SIX OR MORE CHARACTERS
# F
- 异常‘分类’:系统扔异常(占到90%)、自定义异常
134.回顾
-
回顾昨天的内容
文件操作:os.path:dirname()、join()、split()、splitext()、getsize()、isabs()、isdir()、isfile();os:getcwd()、chdir()、listdir()、mkdir()、rmdir()、remove() -
异常的内容:语法错误与异常的区别(大概理解就好)、系统抛出异常的基本格式、自定义异常的格式
最近会减少对该视频的学习,要新开一个numpy、pandas的学习专栏,但是不看完这个视频系列是不会放弃的。