一、异常
异常意味着出现错误,并且会中断程序的正常控制流。使用 raise 语句可以引发异常。格式一般为:raise Exception([value]),其中 Exception 为异常类型,而 value 是一个说明异常相关细节的可选择。
raise sexException("性别只能为男或女")
使用 try 和 except 语句可以捕捉异常:
try:
f=open('foo')
except IOError as e:
statements
出现异常时,解释器将停止执行try代码块中的语句,并寻找可与该异常匹配的 except 子句。如果找到,控制权就会传递给 except 子句中的第一条语句。执行完 except 子句后,控制权就会传递给出现在 try-except 代码块之后的第一条语句。否则,异常将传递给 try 语句所做的上一级代码块。
except 语句具有可选的修饰符 as var,用于保存提供给 raise 语句的异常类型的实例。可使用 isinstance() 函数检查异常类型。
try:
dosex()
except sexException as se:
print(se)
异常类型:已经存在
异常类型:已经存在
异常产生的时机:系统产生
try:
语句体
1/0
except 异常类型:
处理语句
except 异常类型:
处理语句
或者
try:
语句体
except (异常类型1,异常类型2):
处理语句
except Exception:
所有异常
try 语句也支持 else 子句,else 子句必须位于最后一个 except 子句之后。如果 try 代码块中的代码没有引发异常,就会执行 else 子句中的代码。
try:
语句体
except 异常类型 as 名称:
print(名称)
else:
没有异常才会执行的代码
在python2中,捕获所有异常的写法:
try:
except:
最终要执行的内容写在finally中:
try:
except:
else:
finally:一定会执行
finally 子句不是用于捕捉错误的。该语句用于提供无法是否出现错误都必须执行的代码。
l1 = list(range(5))
def showListItem(list1):
print(list1[len(list1)])
def getExcp(fnc,l):
try:
fnc(l)
except IndexError:
print('列表元素下标超出范围。')
except Exception as var:
print(var)
自定义异常:
可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,
class AgeException(Exception):
pass
def checkAge():
while True:
age=input('请输入年龄:').strip()
if age.isdigit():
age=int(age)
if age <0 or age>100:
raise AgeException('年龄超出合理范围。') # 通过 raise 语句引发自定义异常
else:
print(age)
break
with 语句:上下文管理
with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:
with open("myfile.txt") as f:
for line in f:
print(line, end="")
当控制流离开 with 语句后面的代码块时,with 语句将自动关闭已打开的文件。
二,日志 - logging 模块
logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志
Logging有如下级别: DEBUG,INFO,WARNING,ERROR,CRITICAL
默认级别是WARNING, logging模块只会输出指定level以上的log
Formatter对象定义了最终log信息的顺序,结构和内容import logging
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='aaa.txt',level=logging.DEBUG,format=LOG_FORMAT)
def test():
try:
a=int(input("请输入一个被除数:"))
b=int(input("请输入一个除数:"))
print(a/b)
return
except (ValueError):
#处理异常
logging.debug("只能输入数字!")
except ZeroDivisionError:
logging.info("除数不能为0")
else:
print("else...")
finally:
print("程序结束")