python中异常操作

python异常

前言:
Python中的常见异常如下
1)当将不同类型的数据进行运算操作时,有时会引发TypeError(不同类型间的无效操作)异常。
2)当除数为零时,会引发ZeroDivisionError(除数为零)异常。
3)当尝试访问一个未声明的变量时,会引发NameError(尝试访问一个不存在的变量)异常。
4)当解释器发现语法错误时,会引发SyntaxError(Python语法错误)异常。
5)Python最具特色的就是依靠代码块的缩进来体现代码之间的逻辑关系,当缩进错误时,会引发IndentationError(缩进错误)异常。
6)当使用序列中不存在的索引时,会引发IndexError(索引超出序列的范围)异常。
7)当使用字典中不存在的键时,会引发KeyError(字典中查找一个不存在的关键字)异常。
8)当传给函数的参数类型不正确时,会引发ValueError(传入无效参数)异常。
9)当试图用只读方式打开一个不存在的文件时,会引发FileNotFoundError(Python 3.2以前是IOError)异常。
10)当尝试访问未知的对象属性时,会引发AttributeError(尝试访问未知的对象属性)异常。
1.异常检测和处理
1.1 try-except
1.1.1 try-except语句用于检测和处理异常,其最简单的语法格式如下:
try:
#可能会引发异常的代码块
except Exception:
#出现异常后执行的代码块
例:捕获两数相除除数为0的异常。

try:
    a = float(input('请输入被除数:'))
    b = float(input('请输入除数:'))
    c = a/b
    print('商为:',c)
except ZeroDivisionError:
    print('除数不能为0!')

1.1.2针对不同异常设置多个except,处理多个异常的try-except语句,其语法格式如下:
try:
#可能会引发异常的代码块
except Exception1:
#处理异常类型1的代码块
except Exception2:
#处理异常类型2的代码块
except Exception3:
#处理异常类型3的代码块

例:上例添加处理ValueError异常的语句。

try:
    a = float(input('请输入被除数:'))
    b = float(input('请输入除数:'))
    c = a/b
    print('商为:',c)
except ZeroDivisionError:
    print('除数不能为0!')
except ValueError:
    print('被除数和除数应为数值类型!')

1.2.3.对多个异常统一处理
为减少代码量,Python允许将多个异常类型放到一个元组中,然后使用一个except子句同时捕捉多种异常,并且共用同一段异常处理代码。例:将上例的两个异常合并到一个except子句中。

try:
    a = float(input('请输入被除数:'))
    b = float(input('请输入除数:'))
    c = a/b
    print('商为:',c)
except (ZeroDivisionError,ValueError):
    print('捕获到异常!')

1.1.4.捕获所有异常
如果无法确定要对哪一类异常进行处理,只是希望在try语句块出现任何异常时,都给用户一个提示信息,那么可以在except子句中不指明异常类型。例子:

try:
    a = float(input('请输入被除数:'))
    b = float(input('请输入除数:'))
    c = a/b
    print('商为:',c)
except:
    print('出错啦!')

1.1.5 也可以使用Exception关键字代替所有异常。例子:

try:
    a = float(input('请输入被除数:'))
    b = float(input('请输入除数:'))
    c = a/b
    print('商为:',c)
except Exception as r:
    print('捕获到异常:%s'%r)

1.2 try-except-else
try-except语句还有一个可选的else子句,如要使用该子句,必须将其放在所有except子句之后。该子句将在try子句没有发生任何异常时执行。该结构的语法格式如下:
try:
#可能会引发异常的代码块
except Exception [as reason]:
#出现异常后执行的代码块
else:
#如果try子句中的代码没有引发异常,则执行该代码块

例:以只读方式打开文件,并统计文件中文本的行数,如果文件不存在则给出提示信息。

arg = '1.txt'
try:
    f = open(arg, 'r')
except FileNotFoundError:
    print(arg,'文件不存在')
else:
    print(arg, '文件有', len(f.readlines()), '行')
    f.close()

建议在try子句中只放真的有可能会引发异常的代码,将其余代码放在else子句中。

1.3 try-except-finally
在程序中,类似上述情况,无论是否捕获到异常,都需要执行一些终止行为(如关闭文件),Python引入了finally子句来扩展try,该结构的语法格式如下:
try:
#可能会引发异常的代码块
except Exception [as reason]:
#出现异常后执行的代码块
finally:
#无论try子句中的代码有没有引发异常,都会执行的代码块
例:修改上述代码,使其无论是否捕获到异常,都会执行关闭文件的操作。

try:
    f = open('1.txt')
    print(a)
except:
    print('出错啦!')
finally:
    f.close()

1.4 同时包含多个except、else和finally子句
Python异常处理结构中可以同时包含多个except子句、else子句和finally子句,其语法格式如下:
try:
#可能会引发异常的代码块
except Exception1:
#处理异常类型1的代码块
except Exception2:
#处理异常类型2的代码块

else:
#如果try子句中的代码没有引发异常,则执行该代码块
finally:
#无论try子句中的代码有没有引发异常,都会执行的代码块

提示:(1)在上述语句中,异常处理结果必须以“try”→“except”→“else”→“finally”的顺序出现,即所有的except必须在else和finally之前,else必须在finally之前,否则会出现语法错误。
(2)else和finally都是可选的。
(3)else的存在必须以except语句为前提。就是说,如果在没有except语句的try语句中使用else语句会引发语法错误。

例:同时包含多个except、else和finally子句的异常处理。

try:
    a = float(input('请输入被除数:'))
    b = float(input('请输入除数:'))
    c = a/b
    print('商为:',c)
except ZeroDivisionError:
    print('除数不能为0!')
except ValueError:
    print('被除数和除数应为数值类型!')
except:
    print('其他错误!')
else:
    print('运行没有错误!')
finally:
    print('运行结束!')

程序运行效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 抛出异常
2.1 raise语句
2.1.1.使用异常名引发异常
(使用异常名引发异常的基本语法格式如下:
raise 异常名称
当raise语句指定异常名时,会创建该类的实例对象,然后引发异常。
例如:raise NameError
2.1.2 .使用异常类的实例引发异常
使用异常类的实例引发异常的基本语法格式如下:raise 异常名称(‘异常描述’)
通过显式地创建异常类的实例,直接使用该实例对象来引发异常,同时还能给异常类指定描述信息。例子如下:
raise NameError(‘命名错误’)
程序运行结果如下:NameError: 命名错误
):

理解烧看下面实例:
2.1.3 例: raise语句使用(具体实例)。

#定义输出矩形图形的函数
def boxPrint(s, w, h):
    if len(s) != 1:				#当输入的字符不为单个字符时抛出异常
        raise Exception('输入的符号必须是单个字符!')
    if w <= 2: 				#当输入的宽度小于等于2时抛出异常
        raise Exception('宽必须大于2!')
    if h <= 2: 				#当输入的高度小于等于2时抛出异常
        raise Exception('高必须大于2!')
#输出矩形图形
    print(s * w)
    for i in range(h - 2):
        print(s + (' ' * (w - 2)) + s)
    print(s * w)
#给s, w, h赋不同的值
for s, w, h in (('*', 3, 3), ('#', 4, 4), ('$$', 3, 3), ('@', 1, 3),('+', 3, 2)):
#异常处理
    try:
        boxPrint(s, w, h)
    except Exception as err:
        print('发生了一个异常: ' + str(err))

程序运行效果:
在这里插入图片描述
2.1.4.传递异常
捕获到了异常,但是又想重新引发它(传递异常),可以使用不带参数的raise语句。例子:

try:
    raise NameError('命名错误')
except NameError:
    print('出现了一个异常!')
    raise

2.2 assert语句
assert语句又称为断言,断言表示为一些逻辑表达式,程序员相信,在程序中的某个特定点该表达式值为真,如果为假,就会触发AssertionError异常。assert语句的基本语法格式如下:
assert 逻辑表达式 [,参数].
assert后面紧跟逻辑表达式,参数为一个字符串,当表达式的值为假时,作为异常类的描述信息使用。逻辑上等同于:
if not 逻辑表达式:
raise AssertionError(参数)
(看下方实例)
例子:

a = 3
assert a >5, 'a的值应大于5'

例: assert语句使用实例如下

while True:
    try:
        score=int(input("请输入百分制成绩:"))
#断言score是在0~100分之间,如果不是抛出异常
        assert score>=0 and score<=100,'分数必须在1~100之间'
        if score>=90:
            print("优")
        elif score>=80: 
            print("良")
        elif score>=70:
            print("中")
        elif score>=60:
            print("及格")
        else:
            print("不及格")
    except Exception as r:
        print('发生异常:',r)
        break		#跳出循环

程序运行效果如下:
在这里插入图片描述

3.用户自定义异常
Python的异常分为两种:
一种是内建异常,就是系统内置的异常,在某些错误出现时自动触发;
另一种是用户自定义异常,就是用户根据自己的需求设置的异常。
Exception类是所有异常的基类,因此,用户自定义异常类需从Exception类继承。
例:用户注册账户时,输入的性别只能是“男”或“女”,要求自定义异常,当输入数据不是“男”或“女”时抛出异常。例子如下:

#用户自定义异常类
class SexException(Exception):
    def __init__(self,msg,value):
        self.msg = msg
        self.value = value
#定义函数,用于输入性别并判断是否输入的是“男”或“女”
def f():
    sex = input('请输入性别:')
    if sex!='男' and sex!='女':
        raise SexException('性别只能输入男或者女',sex)		#抛出异常
#异常处理
try:
    f()
except Exception as ex:
    print('错误信息是:%s,输入的性别是:%s'%(ex.msg,ex.value))

程序运行效果:
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值