python3异常

一、异常

while True:
    str1='请输入第一个数:'
    str2='请输入第二个数:'
    print('开始执行除法运算')
    op1=int(input(str1))
    op2=int(input(str2))
    result = op1 /op2
    print('%d / %d = %d'%(op1,op2,result))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
Traceback (most recent call last):
  File "/Users/liuqian/PycharmProjects/learn/面向对象/异常.py", line 53, in <module>
    result = op1 /op2
ZeroDivisionError: division by zero

Process finished with exit code 1

异常与错误

异常:在程序的运行过程中发生的不正常的事件,会中断正在运行的程序。

        例如:读取文件时,文件不存在....

                访问数据库时,数据库管理系统没有启动...

                网络连接中断...

                算术运算时,除数为0...

                序列越界......

错误(Error)是指程序有缺陷(Bug)

        语法错误:python解释器无法解释,在程序执行前纠正

        逻辑错误:因为不完整或是不合法的输入导致程序执行得不到预期的结果

异常处理:

    对引发的异常进行处理,保证程序能继续执行并获得正确的结果

异常处理的2个阶段:

    1.引发异常

    2.处理异常

在异常发生时,不仅能检测到异常条件,还可以在异常发生时采取更可靠的补救措施,排除异常

常见的内置异常:NameError  ZeroDivisionError SyntaxError IndexError KeyError IOError AttributeError。。。

二、检测和处理异常:

通过try语句检测异常

任何在try语句块里的代码都会被检测,检查是否与异常发生

try语句的两种主要形式:try-except   try-finally

try-except:定义异常监控的一段代码,并且提供吃力异常的机制(带有多个except的try语句)

    try:

        语句  #被监控异常的代码

    except 异常类[,对象]:

        语句   #异常处理的代码

语句执行顺序:

    1.执行try语句块中的语句

    2.如果出现异常,立即中断try语句的执行,转到except语句块

    3.将异常类型与except语句块中的异常匹配,如果匹配成功,执行相应的异常处理,如果匹配不成功,将异常传递给更高一级的try语句

    4.如果异常一直没有找到处理程序则停止执行,抛出异常信息

加异常处理:

while True:
    str1='请输入第一个数:'
    str2='请输入第二个数:'
    print('开始执行除法运算')
    try:
        op1=int(input(str1))
        op2=int(input(str2))
        result = op1 /op2
        print('%d / %d = %d'%(op1,op2,result))
    except ZeroDivisionError:
        pass
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
开始执行除法运算
请输入第一个数:
while True:
    str1='请输入第一个数:'
    str2='请输入第二个数:'
    print('开始执行除法运算')
    try:
        op1=int(input(str1))
        op2=int(input(str2))
        result = op1 /op2
        print('%d / %d = %d'%(op1,op2,result))
    except ZeroDivisionError as e:
        print(e)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
division by zero
开始执行除法运算
请输入第一个数:

带有多个except的try语句

def xy_float(obj):
    try:
        retval = float(obj)
    except ValueError as e:
        retval = '文字不能转换'
    except TypeError as e:
        retval = '类型错误'
    except Exception as e:
        retval ='有异常'
    return retval
print(xy_float('sss'))
print(xy_float(''))
print(xy_float(22))
print(xy_float('22.2'))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
文字不能转换
文字不能转换
22.0
22.2

Process finished with exit code 0
def xy_float(obj):
    try:
        retval = float(obj)
    except (ValueError,TypeError):
        retval = '参数必须是一个数值或数值字符串'
    except Exception as e:
        retval ='有异常'
    return retval
print(xy_float('sss'))
print(xy_float(''))
print(xy_float(22))
print(xy_float('22.2'))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
参数必须是一个数值或数值字符串
参数必须是一个数值或数值字符串
22.0
22.2

Process finished with exit code 0

BaseException类是所有异常值母

Exception类是其他异常子类的父类

如果多个Except语句块同时出现在一个try语句中,异常的子类应该出现在其父类之前(子类在父类之前

引发多种类型的异常:

    1.排列Except语句的顺序:先子类后父类

    2.发生异常时按顺序逐个匹配

    3.只执行第一个与异常类型匹配的Except语句

else语句块

try:

    语句  #被监控异常的代码

except 异常类[,对象]:

    语句  #异常处理的代码

else:

    语句  #try语句块的代码全部成功时的操作(即没有发生异常)

while True:
    str1='请输入第一个数:'
    str2='请输入第二个数:'
    print('开始执行除法运算')
    try:
        op1=int(input(str1))
        op2=int(input(str2))
        result = op1 /op2

    except ZeroDivisionError as e:
        print('除数不能为零')
    else:
        print('%d / %d = %d' % (op1, op2, result))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
除数不能为零
开始执行除法运算
请输入第一个数:1
请输入第二个数:1
1 / 1 = 1
开始执行除法运算
请输入第一个数:

finally语句块

无论是否发生异常,都会执行的一段代码

可以与try语句块一起使用

    try-except-funally

    try-except-else-finally

    try-finally

通常用来释放占用的资源,例如:关闭文件,文件数据库的连接

读写文件的操作:

filename='e:/xy.tet'
fp=None
try:
    fp = open('e:/xy.tet','r+')
    fp.write('duang')
except IOError:
    print('文件读写出错')
except Exception:
    print('文件操作异常')
else:
    fp.seek(2)
    f = fp.readlines()
    print(f)
finally:
    fp.close()
    print('关闭文件')

三、抛出异常,自定义异常

抛出异常:

    raise语句格式很多,常用格式

        raise 异常类

        raise 异常类(自定义提示信息)

xyname=input('请输入名字:')
if xyname=='小雨':
    raise NameError('不允许输入此姓名!!!')
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
请输入名字:小雨
Traceback (most recent call last):
  File "/Users/liuqian/PycharmProjects/learn/面向对象/异常.py", line 90, in <module>
    raise NameError('不允许输入此姓名!!!')
NameError: 不允许输入此姓名!!!

Process finished with exit code 1
自定义异常类(调用者解决异常)
def xyname():
    xyname = input('请输入名字:')
    if xyname == '小雨':
        raise NameError('不允许输入此姓名!!!')
    return xyname
while True:
    try:
        xyname=xyname()
        print('xyname is %s'%xyname)
        break
    except NameError:
        print('请输入正确的名字')
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
请输入名字:小雨
请输入正确的名字
请输入名字:小李
xyname is 小李

Process finished with exit code 0





      

猜你喜欢

转载自blog.csdn.net/lqian1993/article/details/80380120