9-python异常处理

在这里插入图片描述

一、语法错误

拼写错误

关键字、变量名、函数名等不小心拼写错误

当关键字书写错误,程序运行时系统提示 SyntaxError 错误,而变量名、函数名等书写错误则提示 NameError 错误

如:(打印时变量名书写错误)

在这里插入图片描述

语法规范错误

如逗号、冒号、引号等使用不规范,使用了中文符号,代码缩进错误等,一般来说,python标准缩进是以 4 个空格作为一个缩进,但也可以依据个人习惯,用 Tab 键也可以。

二、异常处理

基本语法

python程序在运行时出现异常而未被处理,程序就会中止运行,因此要对这些异常进行捕获并处理,保证程序正常运行。

python使用 try 语句处理可能出现的异常,其基本语法如下:

try:
    <语句()>   #可能会发生异常的语句(块)
    
except <异常名1>:  #可能发生的异常的名称
    <语句()>		#发生该异常1如何处理
    
except <异常名2>:  #可能发生的异常的名称
    <语句()>		#发生该异常2如何处理
...
else:
    <语句()>		#未发生任何异常将要执行的语句
finally:
    <语句()>		#不论是否发生异常都要执行的语句

这几个语句之间的关系可用下图表示:

在这里插入图片描述

在实际应用中可以不使用 elae 语句 和 finally 语句

实际常用两种形式为:

try:
    <语句()>   
    
except <异常名>:  
    <语句()>		
try:
    <语句()>   
    
except <异常名>:  
    <语句()>	
    
finally:
    <语句()>		

如:例1(计算列表所有数字的和):

L = [1,2,3,4,5,'a',6,7]
s = 0
for i in L:
    try:
        s += i
    except TypeError:
        print('{}不是数字'.format(i))
        continue

print('所有数字的和为:%d'%s)

########### 输 出 ###############
a不是数字
所有数字的和为:28

例2:(打开一个文件并向其中写入内容)

L = ['A','B','C','D']
def writing(x):
    f = open('my_test.txt','a')
    try:
        f.write(L[x])
    except:
        print('IndexError')
        pass
    finally:
        f.close()
        print('文件已关闭')

print('无越界异常')
writing(1)

print('有越界异常')
writing(10)

########### 输 出 ###############
无越界异常
文件已关闭
有越界异常
IndexError
文件已关闭

python内置异常及处理

异常名含义(引发异常原因)
AttributeError调用不存在的方法
EOFError遇到文件末尾
ImportError导入模块出错
IndexError列表越界
IOErrorI/O操作引发的异常,如文件打开出错
KeyError使用字典不存在的关键字引发的异常
NameError变量名不存在
TabError语句块缩进不正确
ValueError搜索列表中不存在的值
ZeroDivisionError除数为0引发异常

except语句主要几种用法:

  • except: 捕获所有异常
  • except <异常名>: 捕获指定异常名的异常
  • except(异常名1, 异常名2): 捕获指定的2个异常
  • except <异常名> as <数据>: 捕获指定异常及其附加数据

在这里插入图片描述

  • except(异常名1, 异常名2) as <数据>: 捕获异常名1或异常名2及其异常附加的数据

三、手工抛出异常

除了程序运行错误会引发异常外,人工也能指定发出异常,并向异常传递数据。

raise语句

程序员可以自定义一些异常,然后通过raise 语句来引发异常,其使用方式有以下几种:

  • raise 异常名
  • raise 异常名(附加数据)
  • raise 类名

例如:

在这里插入图片描述

不论是系统抛出的异常,还是手工抛出的,都可以用 try...except... 语句处理

assert语句

assert语句可以说是raise语句的简化版,翻译为"断言",使用形式为:

assert <条件测试> ,<异常附加数据>

assert语句引发异常的前提是:<条件测试> 为假

例如:(这个例子中当i =8 时抛出异常,异常名是 AssertionError

在这里插入图片描述

使用assert语句不用指出异常名,但raise语句需要。同样 assert语句抛出的异常也能用前面的异常处理方法来处理。

自定义异常类

这里说的自定义并非完全从头开始定义,可以继承其原有的 Exception 来创建自己的子异常类,最简单的定义就只是继承了 Exception 类,如下:

class MyError(Exception):
    pass

如果需要加上一些异常信息,可以重载 __init____str__ 这两个方法

例如:

class MyError(Exception):
    
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return self.value    

raise MyError('00000000')       # 使用raise语句第三种方式抛出异常

在这里插入图片描述

这里使用raise语句第三种方式 raise <类名> 直接抛出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[小G]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值