异常处理

前言

  什么是异常?简单来说就是程序在执行过程中,遇到了某个事件,导致程序不能正确运行。正常情况下,在python无法正确执行时就会发生异常。这时,为了保证程序能够执行,我们需要捕获异常,然后做相关的处理。

1、语法

常见语法如下:

  • try ... except ...
  • try ... except (ValueError,KeyError,Exception...)
  • try ... except (ValueError,KeyError,Exception...) as e
  • try ... except ... else...
  • try ... except ... else...finally
  • try ... except ...raise...else...finally...

关键字解释

try:有可能引发异常的代码

except:捕获异常,可以是多个except

ValueError,KeyError,Exception:异常类型,其中Exception是万能的异常类型

e:别名,可以取除关键字外的任意的名字

else:try中没有引发异常,则执行,可以省略

finally:无论是否捕获到异常都会执行此代码,可以省略

raise:主动抛出异常类型,可以省略

2、示例

try...except...:

age = int(input("请输入您的年龄:"))
if age>=18:
    print("您的年龄是:{age},恭喜您成年了!")
else:
    print("您的年龄是:{age},未成年人!")

当上面的例子中,输入异常的字符时(如非数字),会报错。此时,我们为了避免程序终止,可以做以下改进1:

try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")
    else:
        print("您的年龄是:{age},未成年人!")
except:
    print("您的输入有误!")

  try...except...异常类型 (ValueError/KeyError/Exception...)

但以上的改进是有缺点的,不能明确是何种异常被捕获到了。就类似于一个小偷偷了东西被抓住了,不管他偷了什么东西,一律处罚被判10年。显然这样是不合理的,改进2如下:

try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")
    else:
        print("您的年龄是:{age},未成年人!")
except ValueError:
#我们明确了异常类型是ValueError的情况下,可以在except后面指定具体的异常类型
print("您的输入有误!")

  try...except...异常类型 (ValueError/KeyError/Exception...) as e(别名)

为了能够在界面上显示,详细的异常内容,可以给此异常取一个别名,捕获单个异常

try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")
    else:
        print("您的年龄是:{age},未成年人!")
except ValueError as e:
    print("您的输入有误!",e)


#执行结果
您的输入有误! invalid literal for int() with base 10: 'a'

若不确定捕获到的异常类型,可以将ValueError更改为万能的异常类型Exception

try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")
    else:
        print("您的年龄是:{age},未成年人!")
except Exception as e:
    print("您的输入有误!",e)

#执行结果:
您的输入有误! invalid literal for int() with base 10: 'a'

捕获多个异常

try ,,, except...(ValueError,KeyError,Exception...)和try ,,, except ValueError   except  KeyError except Exception

 

lis = []
try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")
        lis.append(age)
        print(lis[10])
    else:
        print("您的年龄是:{age},未成年人!")
except ValueError as e:
    print("ValueError!",e)
except IndexError as e:
    print("IndexError!",e)
except Exception as e:
    print("您的输入有误!",e)
lis = []
try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")
        lis.append(age)
        print(lis[10])
    else:
        print("您的年龄是:{age},未成年人!")
except (ValueError,IndexError,Exception) as e:
    print("您的输入有误!",e)

try ...except...else

若try中未发生异常,则else部分会执行

lis = []
try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")


    else:
        print("您的年龄是:{age},未成年人!")
except Exception as e:
    print("您的输入有误!",e)
else:
    lis.append(age)
    print("年龄列表:",lis)

#输入年龄20,打印结果如下

请输入您的年龄:20
您的年龄是:{age},恭喜您成年了!
年龄列表: [20]

若try中出现异常,else中的代码不会执行

lis = []
try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")


    else:
        print("您的年龄是:{age},未成年人!")
except Exception as e:
    print("您的输入有误!",e)
else:
    lis.append(age)
    print("年龄列表:",lis)

#输入年龄a,打印结果如下:

请输入您的年龄:a
您的输入有误! invalid literal for int() with base 10: 'a'



try...except...else...finally

finally:无论是否发生异常都会执行的代码

lis = []
try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")


    else:
        print("您的年龄是:{age},未成年人!")
except Exception as e:
    print("您的输入有误!",e)
else:
    lis.append(age)
    print("年龄列表:",lis)
finally:
    print("无论结果如何,都会执行的代码")

#输入年龄aaa
#打印结果如下所示:

请输入您的年龄:a
您的输入有误! invalid literal for int() with base 10: 'a'
无论结果如何,都会执行的代码

raise:主动抛出自定义异常,例如我自定义一个IndexError

lis = []
try:
    age = int(input("请输入您的年龄:"))
    if age>=18:
        print("您的年龄是:{age},恭喜您成年了!")


    else:
        print("您的年龄是:{age},未成年人!")
except Exception as e:
    print("您的输入有误!",e)
  #自定义一个IndexError
raise IndexError else: lis.append(age) print("年龄列表:",lis) finally: print("无论结果如何,都会执行的代码")

 

 

补充:

raise抛出异常时,可以在try中主动抛出,也可以在except中抛出。但要注意的是,主动抛出异常时,raise后面的异常类型和except中的异常类型不能重复了。如我在except中捕获了一个ValueError或者Exception,那么在try中就不能主动抛出一个raise ValueError,否则主动抛出的异常不会生效。

posted @ 2022-08-17 07:27  小疯狗  阅读(48)  评论(0编辑  收藏  举报