异常处理
前言
什么是异常?简单来说就是程序在执行过程中,遇到了某个事件,导致程序不能正确运行。正常情况下,在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,否则主动抛出的异常不会生效。