第九章 异常处理[DDT书本学习 小甲鱼]
Posted daodantou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章 异常处理[DDT书本学习 小甲鱼]相关的知识,希望对你有一定的参考价值。
9.1 你不可能总是对的
举例如下
file_name=input("请输入文件的名称:")
s="C:\\Users\\Daodantou\\Desktop\\"+file_name
f=open(s,"r",encoding="UTF-8")
print("文件的内容是:")
for each in f:
print(each)
-------------------------------
请输入文件的名称:record.txt
文件的内容是:
小甲鱼:你好
。。。。。。
小甲鱼:别这么称呼我,不适应呢
小客服:旁边玩去,我很忙。
=================================
但是如果输入的不是record.txt,则会报错。如下
Traceback (most recent call last):
File "C:/PycharmProjects/my1/t2.py", line 3, in <module>
f=open(s,"r",encoding="UTF-8")
FileNotFoundError: [Errno 2] No such file or directory: ‘C:\\Users\\Daodantou\\Desktop\\322.txt‘
==============================================================================================
以上程序,在客户输入错误的情况下,出现BUG了,FileNotFoundError报错。属于异常。
那么一般都有那些异常呢?
1.AssertionError:断言语句失败 当assert这个关键字后面条件为假,程序停止抛出异常。
assert语句一般用于测试程序的时候,置入检查点:
my_list=["导弹头"]
assert len(my_list)>0 #True
print(my_list.pop())
assert len(my_list)>0 #False
------------------------------------
Traceback (most recent call last):
File "C:/PycharmProjects/my1/t2.py", line 4, in <module>
assert len(my_list)>0 #False
AssertionError
=========================================
2.AttributeErro:尝试访问未知的对象属性
mylist=[]
print(mylist.daodantou)
--------------------------
Traceback (most recent call last):
File "C:/PycharmProjects/my1/t2.py", line 2, in <module>
print(mylist.daodantou)
AttributeError: ‘list‘ object has no attribute ‘daodantou‘
==========================================================
3.IndexError:索引超出序列范围
mylist=[1,2,3]
print(mylist[3])
--------------------
Traceback (most recent call last):
File "C:/PycharmProjects/my1/t2.py", line 2, in <module>
print(mylist[3])
IndexError: list index out of range
===========================================================
4.KeyError:字典中查找一个不存在的关键字
试图在字典查找一个不存在的关键字时候会引发异常,因此建议使用dict.get()方法,
因为dict.get()方法,因为没找到,会返回None或者指定内容,而不会报异常。
mydict={"one":1,"two":2,"three":3}
print(mydict["one"])
print(mydict["four"])
--------------------------------------
Traceback (most recent call last):
File "C:/PycharmProjects/my1/t2.py", line 3, in <module>
print(mydict["four"])
KeyError: ‘four‘
==========================================
5.NameError:尝试访问一个不存在的变量
mydict1={"one":1,"two":2,"three":3}
print(mydict["one"])
-------------------------------------------
Traceback (most recent call last):
File "C:/PycharmProjects/my1/t2.py", line 2, in <module>
print(mydict["four"])
NameError: name ‘mydict‘ is not defined
=============================================
6.OSError:操作系统产生异常
上述开头那个示例中FileNotFoundError异常就是OSError的子类,不再重复。
===============================================
7.SyntaxError:Python的语法错误
print "I love Daodantou"
-------------------------
SyntaxError: Missing parentheses in call to ‘print‘. Did you mean print("I love Daodantou")?
================================================
8.TypeError:不同类型间的无效操作
print(1+"1")
-------------------------------
TypeError: unsupported operand type(s) for +: ‘int‘ and ‘str‘
================================
9.ZeroDivisionError:除数为零
a=5/0
print(a)
-------------
ZeroDivisionError: division by zero
===================================
总结
程序抛出异常就说明程序有问题,但问题不致命,所以捕获异常,纠正错误即可,那么,
该如何捕获异常呢?可以通过try语句实现,任何出现try语句范围内的异常都会被捕获。
try语句有两种形式:一种是try-except,另一种是try-finally.
=====================================
9.2 try-except语句 用来检测和处理异常
语句格式如下:
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
=========举例如下==============
f=open("我为何是个虫子.txt","r",encoding="UTF-8")
print(f.read())
f.close()
----------------------------------
FileNotFoundError: [Errno 2] No such file or directory: ‘我为何是个虫子.txt‘
========因为没有找到该文件,所以报异常了,用户体验不好!修改如下===============
try:
f=open("我为何是个虫子.txt","r",encoding="UTF-8")
print(f.read())
f.close()
except OSError:
print("文件打开过程出错了")
-----------------------------------
文件打开过程出错了
==============================用户被告知了错误,用户体验会好很多=================
不过,程序员角度看,导致OSError的异常原因很多,更在意具体内容,这里可以用as
except OSError as reason:
print("文件打开出错了,
出错原因是:"+str(reason))
--------------------------------------------------------
文件打开出错了,
出错原因是:[Errno 2] No such file or directory: ‘我为何是个虫子.txt‘
=======================================================================
还有三种变式处理方法,分别是
1)一对多 针对不同异常 设置多个except
2)多对一 对多个异常 统一处理
3)笼 统 捕获所有异常
--------------------------- 分别举例练习如下 -----------------------
1)
try:
sum=1+"1"
f=open("我是一个不存在的文件.txt")
print(f.read())
f.close()
except OSError as reason:
print("文件出错了
错误原因是:"+str(reason))
except TypeError as reason:
print("类型出错了
错误原因是:"+str(reason))
----------------------------------------------------
类型出错了
错误原因是:unsupported operand type(s) for +: ‘int‘ and ‘str‘
==============================================================
2)
try:
int("abc")
sum=1+"1"
f=open("我是一个不存在的文件.txt")
print(f.read())
f.close()
except(OSError,TypeError):
print("出错了
错误原因是:"+str(reason))
-----------------------------------------------
这个例子有问题????????????????????
======================================================
3)
try:
int("abc")
sum=1+"1"
f=open("我是一个不存在的文件.txt")
print(f.read())
f.close()
except:
print("出错了,不说原因的那种!")
-------------------------------------------
出错了,不说原因的那种!
===========================================
9.3 try-finally语句
假设 "我是一个不存在的文件.txt"真实存在,open()函数正常返回文件对象,异常发生在
sum=1+"1"上,此时Python直接跳到了except语句,也就是说,没有执行关闭文件的命令。
代码如下:
try:
f=open("我是一个不存在的文件.txt")
print(f.read())
sum=1+"1"
f.close()
except:
print("出错了")
-----------------出现了异常,但是崩溃前应当有收尾工作(比如保存用户数据)
-----------------引入finally来扩展try 【finally=无论如何都将执行的语句】
try:
f=open("我是一个不存在的文件.txt")
print(f.read())
sum=1+"1"
except:
print("出错了")
finally:
f.close()
=================================================
9.4 raise语句 主动抛出异常
try:
s = None
if s is None:
print(‘s是空对象‘)
raise NameError #后面代码不再执行
print(len(s))
except Exception:
print(‘空对象没有长度‘) #仍旧执行的代码
------------------------------------------------------
9.5 丰富的else语句
1.如果,否则
if 条件:
条件成立 执行体
else:
条件不成立 执行体
2.else可以跟for和while循环语句搭配,但是else语句块只有等待循环体执行完成后,
才执行。如若循环体中间用break语句跳出循环,那么else语句块将不再执行了。
举例如下:
def showMaxFactor(num):
count=num//2
while count>1:
if num%count==0:
print("%d最大的约数是%d"%(num,count))
break
count-=1
else:
print("%d是素数!"%num)
num=int(input("请输入一个整数:"))
showMaxFactor(num)
-------------------------------------
请输入一个整数:12
12最大的约数是6
==================================================================
3.和上述循环语句相同,没有异常,那就继续吧!有异常不执行。
try:
int("abc")
except ValueError as reason:
print("出错了"+str(reason))
else:
print("没有任何异常出现啊!")
--------------------------------
出错了invalid literal for int() with base 10: ‘abc‘
=====================================================================
9.6 简洁的with语句
程序中既要打开又要关闭文件,还要关注异常处理有点烦人,出现了with
举个例子:
try:
f=open("record.txt","w",encoding="UTF-8")
for each_line in f:
print(each_line)
except OSError as reason:
print("出错了:",str(reason))
finally:
f.close()
---------------------以上代码,可以用with改写--------------------------
try:
with open("record.txt","w",encoding="UTF-8") as f:
for each_line in f:
print(each_line)
except OSError as reason:
print("出错了:",str(reason))
----------------------------------
出错了: not readable
以上是关于第九章 异常处理[DDT书本学习 小甲鱼]的主要内容,如果未能解决你的问题,请参考以下文章