• python:异常处理及程序调试


     1、异常概述

      在程序运行过程中,经常会遇到各种各样的错误。这些错误统称为“异常”,在这些一场中有的是由于开发者将关键词写错导致,这类错误产生的是SyntaxError.invalid syntax(无效的语句),浙江导致程序不能正确的运行,这类异常是显示的,开发阶段很容易发现,还右一类隐式的,通常和操作有关。

      除了syntaxerro外,python中还有很多异常,比如

     下面详细介绍python 中提供的异常处理语句。

    1、try.........except语句

      在python中提供提供了try.........except语句捕获并处理异常,在使用时,把可能产生的异常代码放在try语句块中,把处理结果放在except语句块中,这样当try语句块中的代码出现错误时,就可以执行except语句块的代码,如果try语句块没有错误,except语句块将不会执行,具体的语法格式如下:

    try:
        block1
    except[exceptionname [as alisa]]:
        bllock2

    参数说明:

    block1:表示可能出现的错误代码。

    ExceptionName[as alisa]:可选参数,用于指定要捕获的异常,其中,ExceptionName表示要捕获的异常名称,如果在其右侧加上as alisa,则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。

    备注:如果在except后面不指定异常的名称,则表示捕获全部异常。

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

    备注:捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。

    例子1:幼儿园分苹果.

    def division():
        '''功能:分苹果'''
        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,"个,剩下",remain,""  )
    try:#捕获异常
        division()#调用分苹果函数
    except ZeroDivisionError:#护理异常
        print('出错了 - -! 苹果不能被0个小朋友分!')

      执行以上代码,输入小朋友人数为0时(如果没有异常处理,输入 0时就会报错)。将不再抛出异常。

      目前,我们只处理了证书为0的情况,如果,我们输入的时候不输出整数,会怎么样?

      从上面可以看出,程序要求输入的输入整数,而实际输入的是小数,抛处了ValueError(传入的值错误),要解决该问题,可以在代码中为try....except再添加一个语句用于处理异常的情况。

    except ValueError as e:#处理异常
        print('输入值错误。!'e)

    备注:在捕获异常时,如果需要同时处理多个异常,也可以用以下代码实现

    except(ValueError,ZeroDivisionError)as e:

    2、try.....except......else语句

      在python中,还右另一种异常处理结构,他是try......except.....else语句,else用于指定当try语句块中没有发现异常时,需要执行的语句块。该语句块中的内容当try语句发现异常时,将不会被执行。例子就不举了。。。。

    3、try.....except......finally

      和else 不同的是,无论程序有无异常发生,finally代码块都会被还行,格式如下

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

    4、使用raise语句爆出异常

      如果某个函数或者方法可能会产生异常,但不想在当前函数或者方法中处理这个异常,则可以使用raise 语句在函数或者方法中跑出异常,语法格式如下:

    raise [ExcepionName [(reason)]]

      其中,ExceptionName[(reason)],为可选参数,用于指定跑出异常信息的相关描述。如果省略,就会把当前的错误原样抛处。

    说明:reason也可以省略,如果省略,则抛处异常时,不附带任何描述信息。

    def division():
        '''功能:分苹果'''
        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,"个,剩下",remain,""  )
    try:#捕获异常
        division()#调用分苹果函数
    except ZeroDivisionError:#护理异常
        print('出错了 - -! 苹果不能被0个小朋友分!')
    抛出异常

    三、程序调试

      在程序开发过程中,避免不了会出现一些错误。有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因为程序会直接停止,别切会给出错误提示。而对于逻辑错误就不太容易发现。因为程序可能会一直执行下去,但是结果是错误的。所以作为一名程序员,掌握一定的程序调试方法,是一项必备技能。

      我不喜欢用程序自带的IDLE进行程序调试,因为我用的是pycharm,自带的断点进行debug调试

  • 相关阅读:
    TypeError: 'encoding' is an invalid keyword argument for this function 解决Python 2.7
    valid-palindrome leetcode C++
    valid-palindrome leetcode C++
    word-break-ii leetcode C++
    word-break-ii leetcode C++
    word-break leetcoder C++
    word-break leetcoder C++
    word-ladder leetcoder C++
    word-ladder leetcoder C++
    triangle leetcode C++
  • 原文地址:https://www.cnblogs.com/sunjinchao/p/11989888.html
Copyright © 2020-2023  润新知