异常处理

异常处理

  • 异常:在编译阶段没有问题,在执行阶段出现问题

  • 语法错误:编译过程出错(应该在程序执行前就进行规避,不应该进行异常处理)

  • 例子:

    num = int(input('>>>'))
    print(num)
    
    • 如果此时用户输入一个字母,程序会报出ValueError的异常错误,这种错误是不可控的,因为输入的数据具有随机性,所以这时需要用到异常处理
    try:
    	num = int(input('>>>'))
    	print(num)
    except ValueError:
    	print('你输入的有误。')
    
    • 这样程序就会进行异常处理,而不会直接抛出异常。
  • 排错原则:报错信息,从下往上找

1. 异常处理核心语法和逻辑

  • 核心语法

    • 简单处理异常
    try:		
    	#可能发生异常的代码
    except 错误类型:
    	#处理代码
    
    • 多分支多次处理多次异常

      • except之间都是互斥的
      try:
      	num = int(input('>>>'))
      	print(num)
      except ValueError:
      	print(666)
      except ValueError:
      	print(999)
      用户输入a
      输出:
      666
      

      程序由上往下执行,遇到符合的except立刻执行不会等待,之后的代码。

    • 合并多分支处理多次异常

      • 将所有会产生的异常,加入到一个元组中

        try:
        	num = int(input('>>>'))
        	print(num)
        except (ValueError,IndexError):
        	print('你输入的有误')
        
        • 由此可以用一条except语句处理ValueError和IndexError两种不同的异常
    • 万能异常处理Exception(少用)

      • 缺点:不知道什么异常
      • 补充一个as语法
        • 使用方法:except Except as e
        • 多分支和万能异常联合使用时将多分支语句放在万能异常之前
    • 异常代码结构:

      try:		#多分支
      	#可能发生异常的代码
      except 错误类型1:
      	#处理代码1
      except 错误类型2:
      	#处理代码2
      	
      try:		#合并多分支
      	#可能发生异常的代码
      except (错误类型1,错误类型2):
      	#处理代码
      
      try:		#多分支和万能异常的联合使用
      	#可能发生异常的代码
      except (错误类型1,错误类型2):
      	#处理代码
      except Exception as e:
      	print(e)
      
    • 异常处理中的其他机制1—else

      • else使用逻辑:当try中全部代码全部执行完毕,才执行else下的代码

      • 应用场景:发送信息等,操作需要回馈信息的场景

      • 例:

        try:
        	#发邮件的逻辑
        except 错误类型:
        	#错误执行代码
        else:
        	#汇报这段代码顺利执行,发送邮件通知或者记录到文件
        
    • 异常处理中的其他机制2—finally

      • 执行机制:无论try中代码是否执行,是否发生异常,都会执行finally内的代码

      • 使用场景:程序的首尾工作(打开了文件,占用了网络资源,打开了一个和数据的链接)

        def func():
        	try:
        		f = open('aaa')
        		return f.read()
        	finally:
        		f.close()
        
    • 异常处理的常用结构

      try/except
      try/except/else		
      try/finally			
      try/except/finally		
      try/except/else/finally
      

2.主动抛一个异常

  • raise语法

    • raise 错误异常

    • raise 错误异常(错误提示)

      a = 666
      if a == 666:
          raise ValueError('不准输出666')
      输出:
      ValueError: 不准输出666
      

3.自定义异常

class AbnerException(BaseException):
	def __init__(self,msg):
		super().__init__()
		self.msg = msg
	def __str__(self):
		return self.msg
raise AbnerException('Abner的异常。')
  • 所有的自定义异常全部要继承BaseException这个所有异常的父类

4.断言

  • assert类似if,但是比if更加苛刻,if不满足条件仅仅不运行,assert没有满足条件之间报错
assert 1 == 1
print(666)
assert 1 == 2
print(999)
输出:
666
AssertionError

5.总结

  • 异常处理应该使用在易发生异常的代码位置,最好不要在程序开头就加上异常处理,这样会使得错误极难排查。
  • 在程序交付使用后可以对整个程序进行万能异常处理,其原因在于提高用户的体验,而不至于程序发送未知错误,直接停止。
原文地址:https://www.cnblogs.com/abner28/p/9629342.html