###python之捕获异常###

###异常###:

  • 程序在运行的时候,如果python解释器遇到一个错误,会停止程序的执行,并且提示一些错误的信息,这就是异常

  • 可能出现的通常由于用输入或操作异常引起的,我们在程序开发的时候,很难将所有的特殊情况都处理。通过异常捕获可以针对突发事件做集中处理,从而保证程序的健壮性和稳定性

  • 在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确)可以增加try来捕获异常
    2.捕获异常的格式
    try这个关键字来捕获异常
    try:
    <尝试执行的代码>
    except<错误类型1>:
    <针对出现错误1,处理的代码>
    except<错误类型2>:
    <针对出现错误2,处理的代码>
    except Exception as <变量>
    <针对不可知异常类型的处理代码>
    else:
    <当没有出现上述异常会执行的代码,出现异常不会执行>
    finally:
    < 无论是否出现异常都会执行的代码>
    “”"
    需求:
    1.提示用户输入一个整数
    2.使用8来除以用户输入的整数
    可能出现的异常类型:
    1.输入的数据类型异常
    2.输入的除数为0 (除数不能为0)

try:
    num = int(input('请输入一个除数:'))
    result = 8/num
except ValueError:
    print('输入的值不是合法的整数')
except ZeroDivisionError:
    print('0不能作为除数')
except Exception as r:
    print('未知错误%s' %(r))
finally:  #无论是否异常都会执行的
    print('####')

运行结果:  #不论运行出现哪种异常,代码都会顺利执行完成不出现报错
请输入一个除数:3.2
输入的值不是合法的整数
####
请输入一个除数:0
0不能作为除数
####

##异常的传递性##
在代码执行过程中,一旦出现异常就会一级一级的传递异常,最终到造成异常出现的地方,如果是调用函数造成的最终会在函数的定义中报异常

def demo1():  #定义函数1
    return int(input('请输入整数:'))

def demo2(): #定义函数2
    return demo1()  #调用第一个函数
   print(demo2())  #打印第二个函数,还是函数一的值
    运行结果:
   请输入整数:2.3  #输入的值不合法,就会一层层传递往上寻找
Traceback (most recent call last):
  File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 127, in <module>
    print(demo2())
  File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 120, in demo2
    return demo1()
  File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 117, in demo1
    return int(input('请输入整数:'))
ValueError: invalid literal for int() with base 10: '2.3'

请输入整数:2
2

该类异常的出现可以直接在函数定义的时候进行异常捕获处理,这样其他的代码再次调用该函数的时候就不会报错

def number():
    try:
        a = int(input('请输入一个数:'))
    except ValueError:
        print('输入的值不合法,请重新输入')
    else:
        return a
def func(x):
    try:
        result = 10/x
    except ZeroDivisionError:
        print('0不能作为除数')
    except Exception as e:
        print('未知错误%s' %(e))
    else:
          return  result
print(func(number()))

##主动抛出异常##
在脚本中为了保证达到一定的条件,可以将没有达到条件的情况设置为异常并且主动抛出,到异常被抛出但没有捕获异常处理时就会出现程序报错且终止运行
ex = Exception(异常类型) #.创建异常对象并且定义一个变量接受
raise ex #主动抛出异常
需求:提示用户输入密码 如果长度小于8 就抛出异常

def input_passwd():
    # 1.提示用户输入密码
    pwd = input('请输入密码:')
    # 2.判断密码的长度
    if len(pwd) >=8:
        return pwd
    # 3.如果<8就主动抛出异常
    print('主动抛出异常')
    #a.创建异常对象
    ex = Exception('密码长度不够')
    #b.主动抛出
    raise ex
# 注意:只抛出异常而不捕获异常 代码会出错
try:
    print(input_passwd())
except Exception as re:
    print(re)

需求:计算10以内的两个数的加法,输入的数如果大于10生成异常且主动抛出

def num():
    try:
        num1 = int(input('请输入一个数:'))
        num2 = int(input('请输入一个数:'))
    except ValueError:
        print('输入的值不合法')
    else:
        if num1<10 and num2<10:
            return num1 + num2
        ex = Exception('输入的数大于10')
        raise  ex
try:
    print(num())
except Exception as n:
    print('输入错误')

###断言###
断言:可以理解为提前预言 让人更好的知道错误的原因
格式:
assert(条件) ‘异常的类型’
就是提前规定的条件必须满足,一但不满足这个条件就会出现异常,并指出了异常类型

def func(num,div):
    assert (div !=0),'div不能为0'
    return num/div

print(func(10,0))
运行:
Traceback (most recent call last):
  File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 153, in <module>
    print(func(10,0))
  File "/home/kiosk/PycharmProjects/20190523/20190524/作业练习.py", line 150, in func
    assert (div !=0),'div不能为0'
AssertionError: div不能为0   #出现异常,并且是指前指定的类型

猜你喜欢

转载自blog.csdn.net/weixin_44821839/article/details/91862440
今日推荐