8-10-异常处理、套接字socket

本周内容:
    day01
        01 异常处理
        02 socket编程
            网络基础:OSI七层协议


    day02
        01 网络基础
        02 socket编程
            基于tcp协议的套接字编程

    day03
        01 粘包问题
        02 基于udp协议的套接字通信

    day04
        01 sockserver编写支持并发的套接字

    day05:
        猴子补丁
        垃圾回收机制
        内置函数
        单例模式
        元类
==============================> 异常处理 <===================================

1、什么是异常
    异常是错误发生的信号,一旦程序出错就会产生一个异常
    如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止

    错误分类:  
	    语法错误:
	    逻辑错误:

    	抛出异常后,程序执行结束,其后的代码不会执行

    补充:
	    程序执行前,先进行语法扫描(只扫描语法错误,不检测逻辑错误,所以语法错误之前的代码会执行),语法通过后再执行



    异常信息由三部分组成
        
        1、追踪信息(具体哪一行代码抛出的异常)
        
        2、类名(异常的种类)
            
            NameError:变量名没有定义过(NameError:变量名事先没有绑定一个值
)
            IndexError:索引不存在
                l=[11,22]
                l[100]
            KeyError
                d={"k1":11}
                d["k2"]

            AttributeError:对象属性不存在
                对象.属性

            ValueError:
                int("asdf")

            TypeError:
                "asdf"+1111

            ZeroDivisionError
                1/0
        3、内容(异常的内容信息)

        		例1
				try:
				    print("====>111")
				    print("====>222")
				    xxx
				    print("====>333")
				except AttributeError as e:
				    print(e)

				print('====>4')

				例2
				try:
				    print("====>111")
				    print("====>222")
				    xxx
				    print("====>333")
				except NameError as e:
				    print(e)

				print('====>4')



2、为何要处理异常
    
    为了增强程序的健壮性


3、如何处理异常
    1、针对语法的错误:应该在程序运行前立即改正
    2、针对逻辑错误:
        2.1 如果逻辑错误发生的条件是可以预知的,应该if判断解决,预防异常
            age = input('>>: ').strip()
            if age.isdigit():
                age=int(age)
                if age > 18:
                    print('too big')
                elif age < 18:
                    print('too small')
                else:
                    print("got it")
            else:
                print('必须输入数字')
        2.2 如果逻辑错误发生的条件是不可预知的,那么异常一个会发生,考虑到程序的健壮性
            我们应该处理异常,做好补救措施
            try:
                代码块
            except 异常的类型:
                发生异常后要执行的代码


4. 异常语句
	try:
		...
	except 异常名 as e: 把异常得到的内容 赋给 e

	注意:
		try中抛出异常以后的代码不会运行
		try之外的代码正常运行


	异常的多分支:

		也可在一个try中 except检测多个异常
			except (NameError,IndexError) as e:

		等效于
			except NameError as e:
			except KeyError as e:


		注意:e 只在excep的子代码块中有效

				# 例3
				try:
				    print("====>111")
				    print("====>222")
				    # xxx
				    # l=[]
				    # l[0]
				    dic={}
				    dic["k1"]
				    print("====>333")
				except (NameError,IndexError) as e:
				    print("=---->",e)
				except KeyError as e:
				    print(e)

				print('====>4')


	finally:无论发不发生异常都会执行
		通常用于测试代码时进行无效的内存回收(因为出错之后,这些内存就成垃圾了,如果不手动清垃圾则会占用内存资源)

				# 例4
				try:
				    print("====>111")
				    print("====>222")
				    xxx=111
				    # l=[]
				    # l[0]
				    dic={}
				    # dic["k1"]
				    print("====>333")
				except (NameError,IndexError) as e:
				    print("=---->",e)
				except KeyError as e:
				    print(e)
				finally:
				    print("一定会运行")
				print('====>4')
				# print(xxx)


				# 例4   能正常运行,但是没有任何意义,属于多余的垃圾
				try:
				    print("====>111")
				    print("====>222")
				finally:
				    print("一定会运行")
				print('====>4')
				# print(xxx)



	完整的异常语句:

		try:
			...

		except 错误类型 as e:
			...

		finally:
			一定会运行的内容(通常用于内存回收)


	万能异常类型:Exception  
		无论什么类型的错误都能匹配到


		用于:对所有类型的异常,都做相同的处理

				# 例5
				try:
				    print("====>111")
				    print("====>222")
				    # xxx
				    l=[]
				    # l[0]
				    dic={}
				    dic["k1"]
				    print("====>333")
				except Exception as e:
				    print("万能异常",e)
				print('====>4')



	raise 主动抛出异常

		NameError('自定义的显示内容')


		补充:
			类的设计者
			类的使用者:程序员

			raise主要作用于 程序员  
				强制让下面的程序员 遵循上面程序员制定的规范
				or 测试自己写的代码是否正常(本意是不希望有异常出现)


				例6
				print('==>11')
				raise NameError("变量名未定义")
				print('==>222')


				例7
				class Animal:
				    def speak(self):
				        raise BaseException("小垃圾必须实现speak方法来覆盖")

				    def run(self):
				        raise BaseException("小垃圾必须实现run方法来覆盖")

				class Dog(Animal):
				    pass

				class Pig(Animal):
				    pass

				d=Dog()
				p=Pig()

				d.speak()
				d.run()

				p.speak()
				d.run()




	自定义异常: 通过继承BaseException
		继承是 is-a  ,通过继承确定 当前类是一个异常类

		继承之后,可以重写父类的方法


				例7
				class Interface(BaseException):
				    def __init__(self, msg, x, y, z):
				        self.msg = msg
				        self.x = x
				        self.y = y
				        self.z = z

				    def __str__(self):
				        return "<%s:%s:%s:%s>" % (self.msg,self.x,self.y,self.z)


				raise Interface("接口异常", 11, 22, 33)



	断言:
		主要用于测试代码时候用,测试完之后,这些额外添加的断言代码删除


		assert 条件

		assert:条件不成立时,底层调用一个raise,抛出一个异常AssertionError


				例8:
				print("====1")
				print("====2")
				print("====3")
				salaries=[1.1,2.2]

				# if len(salaries) != 3:
				#     raise NameError
				assert len(salaries) == 3

				print(salaries[2])
				print(salaries[2])


总结:
	对于可预知:用 if 
	对于不可预知:用try except
		用在无法预料是否发生异常的场景
		比如通信时,无法预知对方什么时候是否能接收到信息

	能不用try就不用

================================> 套接字编程socket <====================================
1、什么是socket

    网络基础==>socket

2、为何要学习socket编程:
    基于socket开发一个C/S或者B/S结构的软件
        Client---------网络------------Server
        Browser--------网络------------Server


	C/S架构:
		
		Client------网络-------Sever

			客户端Client  需要一个程序

				不同平台的PC端、不同平台的手机端
				开发微信小程序,其实就是调用微信的功能,与自己的服务端进行通信

			服务端Sever   需要一个程序


		把三层架构拆分在两个端

			客户端:  视图层
				(和客户打交道)

			服务端:  接口层、数据层
				(数据处理)


	B/S架构:

		Browser------网络--------Server
		(浏览器)


	CS架构比较灵活,自己都能定义
	BS架构,需要遵循浏览器的标准

	-------------------

	标准:大家都是用的统一的规则
		只要遵循这个标准,大家就可以无限制进行通信、交流


	互联网通信协议(标准):计算机界的英语



3、如何基于socket编程

    网络:https://www.cnblogs.com/linhaifeng/articles/5937962.html


    网络是什么=底层的物理连接介质+互联网通信协议
        OSI七层协议

    网络存在的意义=》通信


4、OSI七层协议

	每一层拿到原始数据(应用程序交予的数据)后,包上本层相关信息,送给下一层
		如此一层层下去,直至数据链路层 
	物理层 把收到的东西打散成二进制,传输到目标计算机 
	目标计算机的物理层 把打散的二进制组织一起,送到链路层

	每一层都认识本层的包装,拆开本层的包装,送到上一层
		如此一层层下去,最终把数据送到应用程序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值