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(错误数据)
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个定义异常类并处理输入的示例代码: ```python class InputError(Exception): def __init__(self, message): self.message = message try: name = input("请输入姓名:") age = int(input("请输入年龄:")) majors = {"Computer Science": "计算机科学", "Mathematics": "数学", "Physics": "物理学"} major = input("请输入专业(Computer Science/Mathematics/Physics):") if age < 18 or age > 24: raise InputError("年龄必须在18到24岁之间!") if major not in majors: raise InputError("专业输入有误!") except InputError as e: print(e.message) except ValueError: print("年龄必须为整数!") else: print("姓名:", name) print("年龄:", age) print("专业:", majors[major]) finally: print("输入结束。") assert age >= 18 and age <= 24, "年龄必须在18到24岁之间!" assert major in majors, "专业输入有误!" ``` 代码的解释: - 首先定义了一个名为 `InputError` 的异常类,用于处理输入错误的情况; - 使用 `try` 语句包含需要进行异常处理的代码块; - `input` 函数用于获取用户输入的姓名、年龄和专业; - 如果年龄不在18到24岁之间,就会抛出一个 `InputError` 异常; - 如果专业不在预设的三个专业(计算机科学、数学、物理学)之内,也会抛出一个 `InputError` 异常; - 如果输入的年龄不是整数,就会抛出一个 `ValueError` 异常; - 如果没有抛出任何异常,就会执行 `else` 语句块中的代码,输出姓名、年龄和专业的信息; - 最后使用 `finally` 语句块输出一个提示信息,并使用 `assert` 断言函数确保输入的年龄和专业在正确的范围内。如果断言失败,就会抛出一个 `AssertionError` 异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秒不可闫M先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值