程序出现错误和异常是日常工作非常常见的问题,这些错误可以是语法上的也可以是逻辑上的。良好的异常处理能够让我们快速的定位代码上的问题,一定程度上提高自己的工作效率。
Python主要是通过使用 try / Except / finally来处理异常的问题。它的基本结构如下:
try:<语句> #运行别的代码except <名字>:<语句> #如果在try部份引发了'name'异常except <名字>,<数据>:<语句> #如果引发了'name'异常,获得附加的数据else:<语句> #如果没有异常发生
示例1:异常情况
a = 1/0print(a)>>>ZeroDivisionError: division by zero
因为除数不能为0,所以当程序运行时,就报出除数为0的错误
当使用try except来捕捉异常,如下:
try: a = 1/0 print(a)except: print('代码出现问题!')>>>代码出现问题!
这个时候程序运行的结果就是你用try和except捕捉的错误
示例2:异常的简单处理当可以判断会出错的原因是时,可以将可能出现的原因写下在except里面,如下所示,因为我要求输入的必须是整数,如果不是就报出‘必须输入整数!!!’的错误:
def func(): try: n1 = int(input('请输入第一个整数:')) n2 = int(input('请输入第二个整数:')) print(n1 + n2) except: print('必须输入整数!!!')func()>>>请输入第一个整数:4 请输入第二个整数:a 必须输入整数!!!
示例3:多个except捕捉异常
我把except的异常分为3类,一类是ZeroDivisionError,即'除数不能为0!!!';一类是ValueError,即'必须输入数字!!!';还有一类就是其他我未知的错误,把他统一归纳到Exception里面,以err的方式打印出来,如下:
def func(): try: n1 = int(input('请输入第一个整数:')) n2 = int(input('请输入第二个整数:')) per = input('输入运算符号(+ - * /):') result = 0 if per == '+': result = n1 + n2 elif per == '-': result = n1 - n2 elif per == '*': result = n1 * n2 elif per == '/': result = n1 / n2 else: print('符号输入有误!!!') print('结果是:', result) except ZeroDivisionError: print('除数不能为0!!!') except ValueError: print('必须输入数字!!!') except Exception as err: print('出错啦,出错的原因为:', err)func()
注意:
(1)多个异常的需要注意,最大的Exception需要放在你最后。
(2)如果使用else则在try代码里不能出现return
示例4:try /except /else 捕捉异常将try /except /else 三者连用,如果出现异常,则打印ValueError,如果没有异常则打印'数字输入完毕!'
def func(): try: n1 = int(input('输入一个数字:')) print(n1) except ValueError: print('输入必须是数字!!') else: #没有异常才会进入的代码 print('数字输入完毕!')func()
示例5:try /except /finally 捕捉异常
将try /except /finally 三者连用,如果出现异常,则将异常以err的形式打印出来,而finally里面的内容,无论最终出没出现异常都会进行打印。
def func(): stream = None try: stream = open(r'C:\Users\56331\Desktop\test.txt', encoding='utf-8') container = stream.read() print(container) except Exception as err: print(err) finally: #无论有没有异常都会进入的代码 print('-----finally-----') if stream: stream.close()func()
示例6:raise 抛出异常
raise 异常类型(‘提示信息’),将出现的异常进行抛出,后面的提示信息即为打印的内容。
def register(): phonenumber = input('输入13位手机号码:') if len(phonenumber) != 13: raise Exception('手机号位数错误,必须为13位!!') else: print('输入的手机号为:',phonenumber)register()>>>Exception: 手机号位数错误,必须为13位!!
综合使用
def register(): phonenumber = input('输入11位手机号码:') if len(phonenumber) != 11: raise Exception('手机号不为11位数!!!') else: print('输入的手机号为:', phonenumber)try: register()except Exception as err: print(err) print('注册失败!')else: print('注册成功!') >>>输入11位手机号码:138123412345 手机号不为11位数!!! 注册失败!
总结如下:
- except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。
- except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。
- except语句可以以元组形式同时指定多个异常。
- except语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。
- 如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。
- 不建议捕获并抛出同一个异常,请考虑重构你的代码。
- 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。
异常问题的速查表: