Python知识集合(异常处理和程序调试)

1、异常处理语句

1.1、try…except语句

语法格式:

try:
    block1
except [ExceptionName [as alias]]:
    block2

参数说明:
block1:表示可能出错的代码块

ExceptionName [as alias]:可选参数,用于指定要捕获的异常,其中 ExceptionName表示要捕获的异常名称,如果在其右侧加上 as alias 表示当前的异常指定一个别名。

block2:表示进行异常处理的代码块,在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容

注意:如果except后面不知道异常名称,则表示捕获全部异常。使用try…except语句捕获异常后,程序会继续执行。

1.2、try …except…else语句

try …except…else语句与try …except语句的不同在于当没有异常时,使用else子语句。

例子

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__':
    try:                                                # 捕获异常
        division()
    except ZeroDivisionError:                            # 处理zero异常
        print("\n出错了,不能把苹果分给0个小朋友。")
    except ValueError as e:                              # 处理value异常
        print("输入错误:", e)
    else:                                                # 没有抛出异常时执行
        print("苹果成功分给小朋友。")

1.3、try …except …finally语句

不管是否有异常产生,都会执行finally里的语句
语法格式:

try:
    block1
except [ExceptionName [as alias]]:
    block2
finally:
    block3

例子

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__':
    try:                                                # 捕获异常
        division()
    except ZeroDivisionError:                            # 处理zero异常
        print("\n出错了,不能把苹果分给0个小朋友。")
    except ValueError as e:                              # 处理value异常
        print("输入错误:", e)
    else:                                                # 没有抛出异常时执行
        print("苹果成功分给小朋友。")
     finally:
         print("进行了一次分苹果操作")

输出:

-----------------分苹果了-----------------

请输入苹果个数:8
请输出一共有几个小朋友:0

出错了,不能把苹果分给0个小朋友。
进行了一次分苹果操作

1.4、使用raise语句抛出异常

如果函数或方法中有异常,却不想在当前函数或方法中处理异常,可以使用raise处理异常。
语法格式:

raise [ExceptionName [(raise)]]

2、使用assert语句调试程序

语法格式:

assert expression [,reason]

说明:
expression: 条件表达式,如果该表达式为真什么,都不用做,如果为假抛出AssertionError异常。
reason:可选参数,用于对判断条件进行描述,为了以后更好的知道哪里出了问题
例子

def division():
    ''' 实现功能:分苹果 '''
    print("\n-----------------分苹果了-----------------\n")
    apple = int(input("请输入苹果个数:"))
    children = int(input("请输出一共有几个小朋友:"))
    assert apple > children, "苹果不够分"
    result = apple // children                 # 计算每个小朋友分几个苹果,输出整数
    remain = apple - result * children         # 计算剩下的苹果
    if remain > 0:
        print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,"个,剩下", remain, "个。")
    else:
        print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
    division()

输出:

请输入苹果个数:5
请输出一共有几个小朋友:8
Traceback (most recent call last):
  File "D:/Python/web/test.py", line 14, in <module>
    division()
  File "D:/Python/web/test.py", line 6, in division
    assert apple > children, "苹果不够分"
AssertionError: 苹果不够分

通常情况下,assert语句可以和异常处理语句结合使用,把上面的代码的最后一行语句改为

try:
    division()
except AssertionError as e:
    print("\n输出有误:", e)

输出

-----------------分苹果了-----------------

请输入苹果个数:5
请输出一共有几个小朋友:8

输出有误: 苹果不够分

注意:assert语句只在调试阶段有效。我们可以通过在执行python命令时加入-O(大写)参数来关闭asset语句。
如在命令行窗口下可以使用以下命令

1
python -O 调试文件.py
0%