第九章 异常处理[DDT书本学习 小甲鱼]【1】

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("文件打开出错了,\n出错原因是:"+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("文件出错了\n错误原因是:"+str(reason))
except TypeError as reason:
print("类型出错了\n错误原因是:"+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("出错了\n错误原因是:"+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

原文地址:https://www.cnblogs.com/daodantou/p/10359966.html

时间: 2024-10-03 21:15:55

第九章 异常处理[DDT书本学习 小甲鱼]【1】的相关文章

第六章 函数[DDT书本学习 小甲鱼]【1】

6.1Python的乐高积木 程序分解为小的组成部分.三种方法实现:函数.对象.模块6.1.1 创建和调用函数 以前接触到的BIF就是Python帮我们封装好的函数 def 德芙 关键字: 代码如下 def myFirstFunction(): print("大家好,我是新来的1") print("大家好,我是新来的2") print("大家好,我是新来的3") myFirstFunction() 重复三次,该如何做? for i in rang

第六章 函数[DDT书本学习 小甲鱼]【3】

6.5 lambda表达式 谐音:懒不嗒?lam-b-da 匿名函数 代码 def my(x): teturn 2*x+1 e=my(5) print(e) --------------------- 11 如果使用lambda语句来定义,会是这样 lambda x:2*x+1 返回的是一个函数对象 进行使用,代码如下 g=lambda x:2*x+1 print(g(5)) ------------------------ 11 ================================

第八章 永久存储[DDT书本学习 小甲鱼]【2】

8.1.6 一个任务题目:将record.txt中的对话进行分割,并按照以下规则进行保存起来.1.小甲鱼的对话单独保存为boy_*.txt的文件(去掉"小甲鱼:")2.小客服的对话单独保存为girl_*.txt的文件(去掉"小客服:")3.文章中有三段对话,分别保存为boy_1.txt.boy_2.txt.boy_3.txt.girl_1.txt.girl_2.txt.girl_3.txt.共6个文件.(提示:每段对话用"==="隔开了)****

第三章 必须知道的一些基础知识[DDT书本学习 小甲鱼]【2】

3.6 条件分支========================完成第一个要求 提示作用 计算机如何比较 > < == != >= <= 操作符 开始例子源码 '''=========猜数字游戏==============''' i=7 number=input("猜猜我手中的数字是?:") n=int(number) if n==i: print("你猜对了!") else: if n>i: print("猜大了"

第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【4】

5.1.9 关于分片"拷贝"的概念补充 [真正的拷贝是切片] 代码 list1=[1,3,2,9,7,8] list2=list1[:] print(list2) list3=list1 print(list3) ---------------------- [1, 3, 2, 9, 7, 8] [1, 3, 2, 9, 7, 8] 以上代码看似一样的输出结果,事实上呢,作如下修改后 list1 = [1, 3, 2, 9, 7, 8] list2 = list1[:] list3=l

第七章 字典和集合[DDT书本学习 小甲鱼]【3】

4.copy() 复制字典a={1:"one",2:"two",3:"three"}b=a.copy()print(id(a))print(id(b))a[1]="four"print(a)print(b)-------------------24311023227282431102322800{1: 'four', 2: 'two', 3: 'three'}{1: 'one', 2: 'two', 3: 'three'}==

第四章 了不起的分支和循环[DDT书本学习 小甲鱼]【2】

4.4 Python可以有效避免"悬挂else" Python的缩进使用强制规定使得代码必须正确对齐,else属于那个if清晰可见.4.5 条件表达式(三元操作符) 代码 if x<y: small=x else: small=y 将以上代码用三元操作符来表示 语法 a=x if 条件 else y 含义:如果条件真则a=x,如果条件假则a=y. 代码改进 small=x if x<y else y Python的代码简洁高效!!!4.6 断言 assert 是分支if的近

第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【1】

5.1 列表:一个"打了激素"的数组 很多编程语言里,数组是把一大堆同类型的数据挨个摆在一起,然后通过数组下标进行索引. Python没有数组,但是Python加入了更为强大的[列表].5.1.1 创建列表 例如 number=[1,2,3,4,5] 打了激素过后 例如 mix=[1,"daodantou",3.14,[1,2,3]] 鱼龙混杂的列表 也可以空列表 mix=[]5.1.2 向列表添加元素 可以是使用append()方法 [它不是BIF,是列表对象的一

第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【6】

5.3.1 字符串的各种内置方法 表5-1很多暂时略掉!!!!!!!!! 选择几个常用的演示一下 casefold()方法,它的作用是将字符串的所有字符变为小写 代码 str1="DaoDanTou" print(str1.casefold()) ------------------------ daodantou count(sub[,start[,end]]) 作用:查指定范围内sub字符串出现次数 代码 str1="AbcABCabCabcABCabc" pr