目录
异常概述
异常:异常就是出现错误并且会中断程序的正常执行
补充:Exception
类是 Python 中大多数内置异常类的直接或间接父类。当你捕获 Exception
类型的异常时,实际上可以捕获大部分常见的异常情况,但不会捕获一些特殊的、不继承自 Exception
的异常,比如 SystemExit
、GeneratorExit
和 KeyboardInterrupt
等。
异常处理语句主要有四种
示例库:在输入浮点数或除数为0时会异常
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:"))
result = apple//children # 计算每人分几个苹果
remain =apple-result*children # 计算余下几个苹果
if remain>0:
print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,
"个,剩下",remain,"个。")
else:
print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
if __name__ == '__main__':
division() # 调用分苹果的函数
1. try...except :可以捕获异常并给出相应的处理结果
语法:
try:
block1 #放入可能产生异常的代码
except [ExceptionName [as alias]]
#[ExceptionName [as alias]]:指定要处理的异常,如果不指定则会会处理所有异常
#[as alias]:给异常指定别名,它可以在输出异常内容时通过别名表示
block2 #放入处理结果,如果block1出现异常就会执行block2中的代码
示例
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:"))
if apple < children:
raise ValueError("苹果太少了,不够分...")
result = apple // children # 计算每人分几个苹果
remain = apple - result * children # 计算余下几个苹果
if remain > 0:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,
"个,剩下", remain, "个。")
else:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except ZeroDivisionError: # 处理除数为0的异常
print("\n出错了 ~_~ ——苹果不能被0个小朋友分!")
except ValueError as e: # 处理值为浮点数的异常
print("\n出错了 ~_~ ——",e)
#也可以一次指定多个异常
# if __name__ == '__main__':
# try: # 捕获异常
# division() # 调用分苹果的函数
# except (ZeroDivisionError,ValueError) as e: # 处理异常
# print(e)
2. try...except ...else:在捕获异常时对没有出现异常的情况进行处理
语法:
try:
block1
except [ExceptionName [as alias]]
block2
else:
block3 #没有抛出异常时才执行
示例
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:"))
if apple < children:
raise ValueError("苹果太少了,不够分...")
result = apple // children # 计算每人分几个苹果
remain = apple - result * children # 计算余下几个苹果
if remain > 0:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,
"个,剩下", remain, "个。")
else:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except (ZeroDivisionError,ValueError) as e: # 处理异常
print(e)
else:
print("分苹果顺利完成..") #代码执行正常后再执行
3. try...except finally #无论是否出现异常,都要执行一段固定的代码
在实际项目开发中经常用来实现与关闭相关的操作,比如关闭文件
语法:
try:
block1
except [ExceptionName [as alias]]
block2
finally:
block3
示例
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:"))
if apple < children:
raise ValueError("苹果太少了,不够分...")
result = apple // children # 计算每人分几个苹果
remain = apple - result * children # 计算余下几个苹果
if remain > 0:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,
"个,剩下", remain, "个。")
else:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except (ZeroDivisionError,ValueError) as e: # 处理异常
print(e)
else:
print("分苹果顺利完成..")
finally:
print("进行了一次分苹果操作")
4. 使用raise语句抛出异常
在程序开发时如果某个函数或方法可能会产生异常,但我们不想在当前的函数或方法当中来处理这个异常就可以使用raise语句在这个函数或方法当中来抛出异常,抛出异常后,后面的代码不会再执行
语法:
raise [ExceptionName[(reason)]]
#[ExceptionName[(reason)]]:定义抛出的异常名称,如果省略此参数就会把当前的错误原样抛出
#[(reason)]:异常信息的相关描述,如果省略此参数在抛出异常时就不会附带任何描述信息
示例:模拟幼儿园分苹果(每个人至少分到一个)否则抛出异常
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:"))
children = int(input("请输入来了几个小朋友:"))
if apple < children:
raise ValueError("苹果太少了,不够分...")
result = apple // children
remain = apple - result * children
if remain > 0:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,
"个,剩下", remain, "个。")
else:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
try:
division()
except (ZeroDivisionError,ValueError) as e:
print(e)
程序调试:Python有两种常用调试方法
断点:在进行程序调试运行的时候想让程序在哪里停下来就在哪里设置断点,一个程序中可以设置多个断点
(1)使用python自带的IDLE进行程序调试
打开调试功能:
打开IDLE → Debug → Debugger
debug控制台按钮作用:
Globals:显示全局变量
Go:继续执行
Step:如果在设置的断点处调用了其他的函数,那么单机这个按钮会进入到函数的内部执行
Over:单步执行
Out:跳出函数与Step对应
Quit:结束调试进行修改
设置断点:
光标放在要设置断点的行,鼠标右击选择 SetBreaKpoint
设置好断点后按F5执行代码进行调试
(2)使用assert断言语句调试程序
在 Python 中,assert
是一个用于调试和测试的关键字,它主要用于对程序中的条件进行断言,即检查某个条件是否为真。
基本语法
assert
语句的基本语法格式为:assert expression[, arguments]
。其中,expression
是一个表达式,其结果应该为True
或False
。arguments
是可选的,用于在断言失败时提供额外的信息。
工作原理
- 如果
expression
的值为True
,则assert
语句不做任何事情,程序继续正常执行下一条语句。 - 如果
expression
的值为False
,则assert
语句会触发AssertionError
异常,表明程序中出现了与预期不符的情况。如果指定了arguments
,则会将arguments
的值作为异常的参数传递,以便提供更详细的错误信息。
注意:python -O 文件名.py 命令行选项运行程序时,assert
语句可能会被忽略,因此不应该使用assert
来执行重要的程序逻辑或处理不可恢复的错误。
示例
验证传入的参数是否符合预期;
在编写测试用例时,验证函数或方法的返回值是否符合预期。
def divide(a, b):
assert b != 0, "除数不能为零"
return a / b
def test_divide():
assert divide(10, 2) == 5,"1"
assert divide(5, 1) == 5,"2"
try:
assert divide(10, 1) == 0,"3"
except AssertionError as e:
print(f"测试失败: {e}")
test_divide()
在那些循环或递归等复杂的程序执行过程中,应该始终保持为真的条件
def factorial(n):
assert n >= 0, "输入必须是非负整数"
if n == 0 or n == 1:
return 1
else:
result = 1
for i in range(2, n + 1):
result *= i
assert result > 0, "阶乘结果应该始终为正"
return result