zoukankan      html  css  js  c++  java
  • 异常处理

    异常处理

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

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

    • 例子:

      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.总结

    • 异常处理应该使用在易发生异常的代码位置,最好不要在程序开头就加上异常处理,这样会使得错误极难排查。
    • 在程序交付使用后可以对整个程序进行万能异常处理,其原因在于提高用户的体验,而不至于程序发送未知错误,直接停止。
  • 相关阅读:
    同一子网建立ssh通道,映射到本地
    机器学习线性模型-自定义各个模块阶段
    MATLAB中图像处理的函数
    基于鱼皮肤的鱼个体识别(1)
    防骗指南-东南亚绑架,诈骗,菠菜
    防骗指南-识别传销
    防骗指南-套路贷以及肉偿
    防骗指南-套路贷如何识别
    Opencv 特征提取与检测-Haar特征
    1. QCamera2基础组件——cam_semaphore
  • 原文地址:https://www.cnblogs.com/abner28/p/9629342.html
Copyright © 2011-2022 走看看