11. python从入门到精通——异常处理及程序调试

目录

异常概述

异常处理语句主要有四种

程序调试:Python有两种常用调试方法


异常概述

异常:异常就是出现错误并且会中断程序的正常执行

11. python从入门到精通——异常处理及程序调试_第1张图片

11. python从入门到精通——异常处理及程序调试_第2张图片

异常处理语句主要有四种

示例库:在输入浮点数或除数为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断言语句调试程序

    一般用在对程序某个时刻必须满足的条件进行验证的时候,一般与异常处理语句结合使用

    不能用在检查用户输入,只能用在检查某些内容是否始终为真,如果不能保证说明程序中存在BUG。这是因为assert语句只在调试的时候有有效,可以在命令行执行python命令时通过python -O 文件名.py  来关闭assert语句

    python -O 文件名.py:表示在非调试状态执行语句

    语法:

        assert expression [,reason]

                #expression:要满足条件的表达式,如果为假则抛出 False: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()                   
    
    # 将assert语句和异常处理语句结合使用时,删除上面的division()语句,然后打开下面4行代码的注释
##    try:
##        division()                                    # 调用分苹果的函数
##    except AssertionError as e:
##        print("\n输入有误:",e)

你可能感兴趣的:(python,开发语言)