python入门day14异常

语法错误及异常的认识

#语法错误和异常

#1.语法错误:编译时错误
# while True
#     print('----')

# number = 100
# def func():
#     number+=1


#2.异常:运行时错误
# def chu(a,b):
#     return a/b
# chu(4,0)ZeroDivisionError: division by zero
# print('-----一旦出现异常且没有处理下面就不执行了-----')

#异常处理
'''
try:
    可能出现异常的代码
except:
    匹配异常类型并作相应处理
finally:
    无论是否存在异常都会被执行的代码

'''
def func():
    try:
        n1=int(input('输入第一个数字:'))
        n2=int(input('输入第二个数字'))
        sum=n1+n2
        print('和是:',sum)
    except:
        print('必须是数字')


func()
print('--------')
'''
输入第一个数字:3
输入第二个数字a
必须是数字
--------
'''

异常匹配


def func():
    try:
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字'))
        per = input('请输入运算符(+,-,*,/)')
        result=0
        if per=='+':
            result=n1+n2
        elif per=='-':
            result=n1-n2
        elif per=='*':
            result=n1*n2
        elif per=='/':
            result==n1/n2
        else:
            print('符号输入有误')
            return
        print('结果是',result)
    except ZeroDivisionError:
        print('除数不能为0')
    except ValueError:
        print('必须输入数字')
    except Exception :
        print('出错啦')


func()
'''
输入第一个数字:2
输入第二个数字0
请输入运算符(+,-,*,/)/
除数不能为0
'''
'''
输入第一个数字:3
输入第二个数字a
必须输入数字
'''



#这里引入一张异常类的继承图,然后说明由于异常匹配是按定义顺序匹配的,
# 因此异常类型比较大的应该放在最后去匹配,否则每次都只能匹配到大的,不能匹配到具体的
def func2():
    try:
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字'))
        per = input('请输入运算符(+,-,*,/)')
        result=0
        if per=='+':
            result=n1+n2
        elif per=='-':
            result=n1-n2
        elif per=='*':
            result=n1*n2
        elif per=='/':
            result==n1/n2
        else:
            print('符号输入有误')
            return
        print('结果是',result)

    except Exception:
        print('出错啦')
    except ZeroDivisionError:
        print('除数不能为0')
    except ValueError:
        print('必须输入数字')
func2()
'''
输入第一个数字:3
输入第二个数字0
请输入运算符(+,-,*,/)/
出错啦
'''
'''
情况1try:
        有可能会产生多种异常
    except 异常类型1:
        pass
    except 异常类型2:
        pass
    如果是多个except,异常类型的顺序需要注意,最大的Exception要放到最后
情况2:获取Exception错误原因
    try:
        有可能会产生多种异常
    except 异常类型1:
        pass
    except 异常类型2:
        pass
    except Exception as err:
        print(err)

'''


#当匹配到最大的Exception时,仍想指定具体错误原因
def func():
    try:
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字'))
        per = input('请输入运算符(+,-,*,/)')
        result=0
        if per=='+':
            result=n1+n2
        elif per=='-':
            result=n1-n2
        elif per=='*':
            result=n1*n2
        elif per=='/':
            result==n1/n2
        else:
            print('符号输入有误')
            return
        print('结果是',result)
        # 文件操作,将计算结果保存到文件,如果写时文件不存在则自动创建,读时不存在则保存
        # with open(r'd:\p1\aa2.txt','w') as stream:
        #     stream.write('本次运算结果是{}'.format(result))
        with open(r'd:\p1\aa2.txt', 'r') as stream:
            print(stream.read())
    except ZeroDivisionError:
        print('除数不能为0')
    except ValueError:
        print('必须输入数字')
    except Exception as err:
        print('出错啦',err)
func()
'''
输入第一个数字:3
输入第二个数字3
请输入运算符(+,-,*,/)*
结果是 9
出错啦 [Errno 2] No such file or directory: 'd:\\p1\\aa2.txt'
'''

try…except…else&try…except…finally

#try..except..else
#try..except..finally
'''
try:
    code    #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序

except:  #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息
#except ExceptionName,args:    #同时也可以接受异常名称和参数,针对不同形式的异常做处理

    code  #这里执行异常处理的相关代码,打印输出等

else:  #如果没有异常则执行else

    code  #try部分被正常执行后执行的代码

finally:

    code  #退出try语句块总会执行的程序
'''
'''


    1.这里的 else 是和 try except 连用的,并且 else 只在 try 中代码没有异常的情况下执行,else 必须在 except 这句代码存在的时候才能出现。

    2.finally这个片段里面的代码是肯定在最后执行的,无论前面是否发生异常,最后总会执行finally片段内的代码。

    所以,正常的流程是:try没有发生错误 =else内的代码 =finally中的代码。

    发生异常的流程是:try中发生异常 =》被except捕获并执行except片段中的代码 =》执行finally中的代码。


也就是捕获到try的异常就执行except但是不执行else--finally
没有异常就执行else--finally
'''


def divide(a,b):
    return a/b

##1.通过try-except捕获异常
try:
    divide(1, 0)
except:
    print("divide by 0")
else:
    print("the code is no problem")
finally:
    print("finally, hello world!")
'''
divide by 0
finally, hello world!
程序出现异常,被except捕获到,else不会执行,finally始终执行
'''

##2.else只在没有异常的时候执行
try:
    divide(1, 1)
except:
    print("divide by 0")
else:
    print("the code is no problem")
finally:
    print("finally, hello world!")
'''
the code is no problem
finally, hello world!
'''
'''
异常情况3try:
    有可能有异常的代码
except 类型1:
    pass
else:
    如果try中没有发生异常则进入这里
'''

def func():
    try:
        n1=int(input('输入数字:'))
        print(n1)
    except ValueError:
        print('必须是数字..')
    else:
        print('数字输入完毕')

func()

print('------------------------------------')

def func():
    try:
        n1=int(input('输入数字:'))
        print(n1)
        return 1
    except ValueError:
        print('必须是数字..')
        return 2
    else:
        print('数字输入完毕')

func()
'''
没有异常会到else,但是如果在到else前遇到return就会被拦截
输入数字:2
2
数字输入完毕
------------------------------------
输入数字:2
2
'''

'''
输入数字:a
必须是数字..
------------------------------------
输入数字:a
必须是数字..
'''
#总结:如果使用else则在try代码中不能出现return
#异常情况4
'''
#文件操作
try :
    pass
except:
    pass
finally:
    pass
    #无论有没有异常都会执行finally

'''
def func():
    stream=None
    try:
        stream = open(r'd:\p1\a.txt')
        container=stream.read()
        print(container)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        print('finally------------')
        if stream:#不为空则关闭
            stream.close()
        return 3
x=func()
print(x)#现在我有这个文件,打印结果是3,代表前面即使return了依旧会进入fianlly
#因此无论是否异常,是否return都会进入finaly

#如果现在文件不存在,保存,依旧打印3

主动抛异常

#主动扔出异常

#注册 用户名必须6位
# def register():
#     username=input('输入用户名:')
#     if len(username)<6:
#         raise Exception('用户长度必须6位以上')#抛出错误的提示信息
#     else:
#         print('输入的用户名是:',username)
#
# register()
'''
输入用户名:admin
Traceback (most recent call last):
  File "D:/pythonFile/hanshu/excepttt6/func07.py", line 11, in <module>
    register()
  File "D:/pythonFile/hanshu/excepttt6/func07.py", line 7, in register
    raise Exception('用户长度必须6位以上')#抛出错误的提示信息
Exception: 用户长度必须6位以上
'''

def register():
    username=input('输入用户名:')
    if len(username)<6:
        raise Exception('用户长度必须6位以上')#抛出错误的提示信息
    else:
        print('输入的用户名是:',username)
try:
    register()
except Exception as err:#err是用户长度必须6位以上
    print(err)
    print('注册失败')
else:
    print('注册成功')
'''
输入用户名:dd
用户长度必须6位以上
注册失败
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值