1、异常处理机制
1.1内置异常
常见的内置异常,修改元组,输出变量为被定义,强转错误,将字符串转成整型,索引超范围,除数不能为0,引用未被定义的模组,字符串与整型加减,各种语法错误等等
1.2内置异常处理
异常处理是对异常进行捕获、抛出、处理,提高程序健壮性的机制。
算法的设计要求:正确性、可读性、健壮性、高效率、低存储
使用关键字try except finally else组合成不同的处理方式,其中try和except是核心。
(说白了就是把红色异常报错给显示成正常的输出提示)
try:a=3b=0c=a/b
except Exception as e:print(f'出现{e}错误')
else:print(c)
finally:print('我总是出现')
try:中输入正常函数,
except Exception as e:
如果正常函数有误报错,则执行此段代码,print(f'出现{e}错误')将报错原因输出
else:
如果函数正常不执行except Exception as e:则执行else
finally:
此函数总是执行
except有多种用法:如果想检测多样的错误,
例如:
try:
函数
except Axxx错误:
print('A错误')
except Bxxx错误:
print('B错误')
else:
xxx
或者 可以将except写成except(Axxxx,Bxxxx):
1.3 自定义异常
除了内置异常还有自定义异常,要引用到raise
raise可以抛出异常--内置异常或者自定义异常都可以
class myexception(BaseException):def __init__(self,n):self.n=ndef __str__(self):return self.n
try:raise myexception('错误错误')
except myexception as e:print(e)
上面先定义一个异常类,继承BaseException(这个异常类的顶层基类)然后初始化一下,接受参数赋值给n,再返回实例变量n,这样在异常的时候会打印该值
然后try:
-
raise myexception('错误错误')
语句会创建并抛出一个myexception
异常对象,传入字符串'错误错误'
作为错误信息。 -
这个异常被触发并且抛出之后,程序的执行会跳转到
except
块中,等待异常的捕获。
然后except捕获到了myexception类型的异常,并将其赋值给变量e,然后在输出e,将这个异常类中的返回值打印出来
demo1
编写一个函数,接受一个数字 n 作为参数 要求: 如果 n 小于 0, 则抛出一个自定义的异常“NegativeNumberError”。
class NegativeNumberError(BufferError):def __init__(self,msg):self.msg=msgdef __str__(self):return self.msg
def fun1(a):if a<0:raise NegativeNumberError('数字小于0')else:return a
try:print(fun1(8))print(fun1(-3))
except NegativeNumberError as e:print(e)
编写一个函数,接受一个字符串 s 作为参数 要求: 如果 s 的长度小于 10, 则抛出一个自定义的异常“StringLengthError”。
class StringLengthError(BufferError):def __init__(self,msg):self.msg=msgdef __str__(self):return self.msg
def fun1(a):if len(a)<10:raise StringLengthError('长度小于10')else:return f'长度为{len(a)}'
try:print(fun1('dsdwfdwadfdfesfef'))print(fun1('ddfes'))
except StringLengthError as e:print(e)
1.5日志的简单应用demo2
在python中,记录日志使用logging库,日志的级别从高到低分别为:
- CRITICAL:系统崩溃级别的错误,必须立即处理
- ERROR:运行时的错误,可能导致程序无法正常运行
- WARNING:警告信息
- INFO:信息性消息,程序正常运行
- DEBUG:详细信息,通常在诊断问题时有用
import logging
# 设置日志的打印级别
logging.basicConfig(level=logging.DEBUG)
logging.critical('这是一个critical信息')
logging.error('这是一个error信息')
logging.warning('这是一个warning信息')
logging.info('这是一个info信息')
logging.debug('这是一个debug信息')
# 向指定的日志文件里去打印日志信息
import logging
logging.basicConfig(filename='./app.log')
logging.warning('这是一个warning信息')logging.basicConfig(filename='./app.log', level=logging.DEBUG, filemode='a',format='%(name)s - %(levelname)s - %(message)s')
logging.warning('这是一个warning信息')# %(name)s 日志记录器的名字
# %(levelname)s 日志级别
# %(asctime)s 时间
# %(message)s 消息本身