python3之异常处理try-except(finally)、raise,assert

异常处理

在解释异常处理前先了解一下什么是错误:

¥¥错误是指由于逻辑或语法导致一个程序无法正常执行的问题

再来说说什么是异常以及该怎么解决:

​ 什么是异常:

​ 异常是值程序出错时标识的一种状态

​ 当异常发生时,程序不会再向下执行,而转去调用此函数的地方处理此函数并恢复到正常状态

​ 异常的作用是什么呢?

​ 异常是一种信号,来通知上层调用者有错误产生需要处理

语法:

​ try 语句的两种语法:

  1. try-except 语句
  2. try-finally 语句

    ​try-except 语法:

try:
    可以触发异常的语法
except 错误类型1 [as 变量1]
    异常处理语句1
except 错误类型2 [as 变量2]:
        异常处理语句2
except (错误类型3, 错误类型4):
    异常处理语句3
...
except:
    异常处理语句other
else:
    未发生异常语句
finally:
    最终语句
try-except的作用:

​ 尝试捕获异常(接收异常通知),将程序转为正常状态并继续执行

​ 语法说明:

​ as 子句是用于绑定错误对象的变量,可以省略

​ except 子句可以有一个或多个,但至少要有一个

​ else 子句最多只能有一个,也可以省略

​ finally 子句最多只能有一个,也可以省略

异常实例讲解:

def div_apple(n):
    print('%d个苹果您想分给几个人?' % n)
    s = input('请输入人数:')
    cnt = int(s)   # <<-- 可能触发异常ValueError错误进入异常
    result = n / cnt  # <<-- 可能触发ZeroDivsionError错误进入异常
    print('每个人分了', result, '个苹果')

try:  # 正常执行
    div_apple(10)
    print('分苹果完成')


#-------------模块一:except 错误类型,捕获异常类型---------------------------
# except ValueError:  # 只有在有异常时才会执行
#     print('在try的内部语句中发生了值错误,已处理并转为正常状态')
# except ZeroDivisionError:
#     print('输入人数为0,分苹果失败')
#-------------------------------------------------------------------------



#---模块二:except(错误类型1,错误类型2):满足这两个错误类型都执行这个函数------
# except (ValueError, ZeroDivisionError):
#     print('苹果不分了')
#--------------------------------------------------------------------------



#--模块三:except:除了捕获的之外,不管什么异常都执行此函数----------------------
# except ValueError:  # 只有在有异常时才会执行
#     print('在try的内部语句中发生了值错误,已处理并转为正常状态')
# except:
#     print('收到除ValueError之外的错误通知')
#---------------------------------------------------------------------------



#--模块四:as 变量: 将捕获的错误信息用变量绑定----------------------------------
# as 的用法
# except ValueError as err:
#     print('错误的值是:', err)  # invalid literal for int() with base 10: 'aaa'

    # 10个苹果您想分给几个人?
    # 请输入人数: aaa
    # 错误的值是: invalid literal for int() with base 10: 'aaa'
    # 程序正常退出
#---------------------------------------------------------------------------



#--模块五:else的用法,只有在try是没有异常的时候才会执行--------------------------
# except ValueError:
#     print('苹果不分了')
# else:  # 只有在try没有发生错误时才会执行
#     print('在当前try语句内部,没有发生任何异常,程序正常执行')
#----------------------------------------------------------------------------



#--模块六:finally的用法,不管try有没有错误,其下的语句块都会执行------------------
# finally字句的用法
except ValueError:
    print('苹果不分了')
except:  # 除ValueError异常外的异常
    print('错误值是:0' )
else:  # 如果没有异常才执行
    print('else子句被执行了')
finally:  # 不管有没有异常都会执行的语句
    print('finally子句被执行了')
print('程序正常退出')
#-----------------------------------------------------------------------------

一个练习:
写一个函数,get_score() 来获取学生输入的成绩(0-100的整数)输入如果出现异常,则让此函数返回0,否则返回用户输入的成绩

def get_score():
...
score = get_score()
print('学生的成绩是:', score)

注:try-except语句也可以放在函数的内部使用

# 方法一
def get_score():
    try:
        score = int(input('输入成绩: '))
    except ValueError:
        return 0
    if score in range(101):
        return score
    else:
        return 0
score = get_score()
print('学生的成绩是:', score)


# 方法二
def get_score():
    score = int(input('输入成绩: '))
    if score in range(101):
        return score
    else:
        return 0
try:
    score = get_score()
except ValueError:
    score = 0
print('学生的成绩是:', score)

raise 语句:

作用:
触发一个错误,让程序进入异常状态
发送错误通知给程序调用者
语法:
raise 异常类型

raise 异常对象

raise # 重新触发上一次异常

def get_age():
    age = int(input('请输入年龄(1-140):'))
    if age in range(1, 141):
        return age
    raise ValueError  # 故意抛出异常
try:
    age = get_age()
    print('用户输入的年龄是:', age)
except ValueError as err:  # 接收抛出的异常
    print('用户输入的年龄不在1-140之间,获取年龄失败!')

assert 语句(断言语句)
语法:
assert 真值表达式,错误数据(通常是字符串)

作用:
当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态

等同于:

if 真值表达式 == False:
    raise AssertionError(错误数据)

猜你喜欢

转载自blog.csdn.net/geek_xiong/article/details/81915786