Python ——异常

目录

case1:

case2:多个except

case3: 获取确切的错误原因(Exception)

try......else...

try......finally...

手动抛出异常:raise


 

case1:

# 异常:没有语法错误,运行时候才可能会出现的错
# 出现异常后,其后面的代码不会被执行


# 异常处理
'''
格式:
try:
    可能出现异常的代码
except:
    出现异常执行的代码
finally:  (可有可无)
    有无异常都会执行的代码
'''


# 除法运算
def chufa1():
    a = int(input('请输入第一个数字:'))
    b = int(input('请输入第二个数字:'))

    try:
        res = a / b
        print('除法运算的结果为:',res)
    except:
        print('输入必须为数字且第二个数字不能为0!!!')
    finally:
        print('除法运算结束!')


# chufa1()


case2:多个except

# 有特定异常类型的异常处理机制 多个except
'''
格式:
try:
    可能出现异常的代码
except 异常的类型1:
    出现异常1执行的代码
except 异常的类型2:
    出现异常2执行的代码
finally:  (可有可无)
    有无异常都会执行的代码
'''
'''
异常类型有:ZeroDivisionError,ValueError,NameError,Exception等,
各个异常类型是有优先级的,Exception高于ZeroDivisionError,ValueError等
在放置各个异常类型的时候,要先放置子异常类型,再放父异常类型
'''
def chufa2():
    try:
        # 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
        a = int(input('请输入第一个数字:'))
        b = int(input('请输入第二个数字:'))
        res = a / b
        print('除法运算的结果为:',res)
    except ZeroDivisionError:
        print('输入的第二个数字不能为0!!!')
    except ValueError:
        print('必须输入数字!!!')
    finally:
        print('除法运算结束!')


# chufa2()

case3: 获取确切的错误原因(Exception)


# 当出现错误的时候,获取确切的错误原因
'''
格式:
try:
    可能出现异常的代码
except 异常的类型1:
    出现异常1执行的代码
except 异常的类型2:
    出现异常2执行的代码
except Exception as err:
    print(err)  #  err的内容就是错误的类型
finally:  (可有可无)
    有无异常都会执行的代码
'''


def func():
    try:
        # 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
        a = int(input('请输入第一个数字:'))
        b = int(input('请输入第二个数字:'))
        res = a / b
        print('除法运算的结果为:',res)

        # 目前无该文件
        with open(r'D:\haha.txt','r') as rstream:
            print(rstream.read())
    except ZeroDivisionError:
        print('输入的第二个数字不能为0!!!')
    except ValueError:
        print('必须输入数字!!!')
    except Exception as err:
        # 不是以上两种错误时候,返回其具体错误类型
        print('出错了,错误类型是:',err)
    finally:
        print('除法运算结束!')


func()
# 请输入第一个数字:1
# 请输入第二个数字:2
# 除法运算的结果为: 0.5
# 出错了,错误类型是: [Errno 2] No such file or directory: 'D:\\haha.txt'
# 除法运算结束!

try......else...

# try... else
'''
try:
    可能出现异常的代码
except 类型1:
    pass
else:
    如果try中没有发生异常则进入的代码
PS: 如果使用else,则在try中不能出现return
'''


def chufa():
    try:
        # 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
        a = int(input('请输入第一个数字:'))
        b = int(input('请输入第二个数字:'))
        res = a / b
        print('除法运算的结果为:',res)
    except ZeroDivisionError:
        print('输入的第二个数字不能为0!!!')
    except ValueError:
        print('必须输入数字!!!')
    else:
        # 出现异常的时候就不会执行
        print('除法运算顺利结束!')

# chufa()


# try中含有return时候else就不起作用
def chufa_rerurn():
    try:
        # 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
        a = int(input('请输入第一个数字:'))
        b = int(input('请输入第二个数字:'))
        res = a / b
        print('除法运算的结果为:',res)
        return res
    except ZeroDivisionError:
        print('输入的第二个数字不能为0!!!')
    except ValueError:
        print('必须输入数字!!!')
    else:
        # 出现异常的时候就不会执行
        print('除法运算顺利结束!')

# chufa_rerurn()

try......finally...


'''
try ...finally...的使用场景:
1.文件流的关闭
2.数据库操作:如数据库关闭
'''

def func():
    stream = None # 必须先定义一下,否则finally里面无法使用
    try:
        stream = open(r'D:\none.txt','r')
        container = stream.read()
        print(container)
    except Exception as err:
        print(err)
    finally:
        print('-----finally----')
        if stream:
            stream.close()

func()
# [Errno 2] No such file or directory: 'D:\\none.txt'
# -----finally----


含有return的时候,
def func():
    stream = None # 必须先定义一下,否则finally里面无法使用
    try:
        stream = open(r'D:\none.txt','r')
        container = stream.read()
        print(container)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        print('-----finally----')
        if stream:
            stream.close()
        return 3

func()
# 无异常的时候,try里面的return 1不会立刻返回,
# 到了finally之后, rerun 3 会覆盖1 而返回;
# 有异常的时候,except里面的return 2不会立刻返回,
# 到了finally之后, rerun 3 会覆盖2而返回

手动抛出异常:raise

# 异常抛出:raise
# 自定义异常

def regis():
    uname = input('用户名:')
    if len(uname) < 6:
        raise Exception('用户名长度需要至少6位!!!')
    else:
        print('您输入的用户名为:', uname)

# 调用1:
# regis()
# 用户名:wqqs
# Traceback (most recent call last):
#   File "D:/Python/code/functionstudy/yichang.py", line 223, in <module>
#     regis()
#   File "D:/Python/code/functionstudy/yichang.py", line 219, in regis
#     raise Exception('用户名长度需要至少6位!!!')
# Exception: 用户名长度需要至少6位!!!


# 调用2:
try:
    regis()
except Exception as err:
    #当try里面raise异常的时候,Exception就会接住这个异常
    print(err)
    print('注册失败')
else:
    print('注册成功')

 

ps: 在研发过程中,一般是让系统来抛异常,只有特定需要的时候才会手动抛出异常。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值