Python基础——异常

目录

一、异常的概念:

常见的异常:

二、异常的捕获:

1.异常捕获的基本语法:

2.捕获指定的异常:

3.捕获多个异常:

三、else,finally子句:

四、异常具有传递性:


一、异常的概念:

异常简单来说就是程序运行过程中出现的错误,也叫BUG。

常见的异常:

  • SyntaxError :语法错误,说明书写代码的格式有误,只需要改正格式即可。
  • ZeroDivisionError :除零错误,说明代码段中出现了0在分母的情况。
  • Traceback :路径错误,说明找不到指定的路径或者提供的路径有误。
  • NameError :变量名错误,说明变量未被定义或者名称不符合规范。
  • TypeError :类型错误:往往出现在将字符串与整形串联的情况下。
  • KeyError :键错误,说明dict类型中没有所要求的键。
  • IndexError :索引错误,往往出现在list类型的索引超出范围。
  • ValueError :值错误,传入的参数不符合规范。

二、异常的捕获:

当出现异常时,程序往往会中断报错甚至直接退出,而在程序的运行中经常会出现不可预料的错误,例如,当用户在app上输入不合规范的数据时,程序会抛出ValueError的错误后闪退,这对用户非常不友好,所以我们往往需要预料到可能会出现的异常,然后做出处理,确保程序不会无缘无故地退出。

下面就对上述例子中的问题进行优化:

1.异常捕获的基本语法:

try:
    #可能出现错误的代码块
except :
    #处理异常代码块

2.捕获指定的异常:

try:
    print(a) #a未被定义,可能会报NameError
except NameError as e:#将NameError指定一个别名e,方便后续引用
    print("变量未被定义",e)

3.捕获多个异常:

try:
    print(a = 1/0) #a未被定义,可能会报NameError
except (NameError,ZeroDivisionError) :#将NameError指定一个别名e,方便后续引用
    print("变量未被定义 或 除零错误")

当需捕获全部的错误时,可以直接用Exception代表所有异常,同时,将异常名指定为e,可以同时输出e达到确定错误类型的目的。

try:
    print(a) #a未被定义,可能会报NameError
except Exception as e :#将NameError指定一个别名e,方便后续引用
    print("出现异常",e)

知道这些处理方法以后,例子中的输入程序可优化为:

while True:
    try:
        number = int(input("请输入一个数字:"))
    except ValueError:
        print("您输入的不是有效数字,请重试!")

三、else,finally子句:

当判断完毕try中是否有语法错误后,如果想要继续程序怎么办呢?这时候可以用else语句,else语句后面的代码表示如果没有错误就会执行的代码。

不管有没有错误发生,我一定想要执行一段代码怎么办呢?这时候finally子句派上用场了,finally后面的代码表示不管有没有错误都会执行的代码。

a = '试验是否有异常'
try:
    print(a) #a未被定义,可能会报NameError
except Exception as e :#将NameError指定一个别名e,方便后续引用
    print("出现异常",e)
else:
    print("未出现异常,跳转到这里")
finally:
    print("不管有没有异常,这句话一定会执行")

当没有错误时,结果如下:

Python基础——异常_第1张图片

当出现错误时,结果如下:

Python基础——异常_第2张图片


四、异常具有传递性:

当异常出现在子程序中时,可以通过主函数中的子函数调用传递到主函数中,使主函数也报错。

测试用例:

def func1():
    print("func1开始运行")
    1/0
    print("func1结束运行")

def func2():
    print("func2开始运行")
    func1()
    print("func2结束运行")

def main():
    print("main开始运行")
    func2()
    print("main结束运行")

main()

 运行后发现,func1,func2,main中都有报错,说明func1中的错误通过子函数调用传递到了其他函数段。

通过异常的传递性,我们可以在最顶层的函数(这里是main函数)中对错误进行统一的捕获与处理,而不用在每个子函数中分别处理,优化了代码结构,上述代码中异常处理过程如下:

def func1():
    print("func1开始运行")
    1/0
    print("func1结束运行")

def func2():
    print("func2开始运行")
    func1()
    print("func2结束运行")

def main():
    print("main开始运行")
    try:
        func2()
    except Exception as e:
        print("出现异常了,异常是",e)
    print("main结束运行")

main()

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