python异常处理

时间:2024-11-17 20:33:33
目录:
  1. 什么是异常?
  2. 为何要进行异常处理
  3. 如何进行异常处理
  4. 主动触发异常raise
  5. 断言
  6. 自定义异常

什么是异常?

  • 异常是错误发生的信号,程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止

例如:

print('start')
x = 1
y = 2
if 
print('end')  # 程序一句也不会运行直接报错,运行前会先检测语法
  • 1
  • 2
  • 3
  • 4
  • 5

异常分为三部分

  1. 异常的类型(一个个的类)
  2. 异常的内容、提示信息
  3. 异常的追踪/定位信息信息

异常的分类:

  • 语法上的错误(如上例)

  • 逻辑上的错误

  # NameError
  age = 12
  a
  # IndexError
  l = [1,2,3]
  l[123]
  # KeyError
  d = {'name':'jason'}
  d['password']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

回到目录

为何要进行异常处理

  • 增强程序的健壮性

如何进行异常处理

  • 语法:
try
	...
except
	...
  • 1
  • 2
  • 3
  • 4
  • 示例:
#针对逻辑上的异常才应该使用try...except去捕捉异常进行处理
#1、异常的单分支(单个except)
#2、异常的多分支(多个except)
#3、万能异常:Exception,可以匹配所有种类的异常(挨个注释挨个尝试)
#4、多分支+Exception,注意Exception一定要放到except 其他异常的的后面
#5、try...else,else会在被检测的代码块没有异常发生的情况下执行, else一定要与except连用,并且一定要放到多个except后面

try:
    d = {'name': 'jason'}
    d['password']
    # a = 1
    # x
    # l = [1,2,3,4]
    # l[123]
    print('haha')
    pass
except Exception as e:
    print(e)
else:
    print('当try里面的代码没有报错的情况下走else')
finally:
    print('无论前面有没有报错 我都会执行')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

try…finally,finally的代码,无论被检测的代码有无异常,都会执行,通常在finally内做一些回收资源的事情,例如:

try:
    f = open('','w',encoding='utf-8')
    ()
finally:
    ()
print('other...')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

回到目录

主动触发异常raise 异常类型(’异常的内容‘)

  • 应用于程序中自定义某种法则,一旦不遵循则会像抛出语法异常一样,终止程序的运行
class People:
    def __init__(self,name):
        if not isinstance(name,str):
            raise TypeError('%s must be str type'%name)
         = name
  • 1
  • 2
  • 3
  • 4
  • 5

断言

  • 当assert条件不满足是抛出AssertionError,提示信息
l = [1, 2, 3]
#正常运行
assert len(l) > 2
l = [1, 2]
#报错
assert len(l)>2,"l范围小于三"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

自定义异常

class MyError(BaseException):
     def __init__(self,msg):
         super().__init__()
         =msg
     def __str__(self):
         return '<%s>' %
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • raise MyError(‘我自己定义的异常’) # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法

回到目录