一、异常处理
try和except
释义:
try是让程序先试着执行try下的代码,如果不报错就走这条;
except是一旦try下的代码在执行过程中报错,就走except这条。
例如一段代码:
try: print(11111) # l = [] # l[2] int('a') print(222222) except Exception as e:print(e)
11111是打印的,但执行到int('a')就会报错,那么此时就走except,打印报错信息。
finally用法:finally是一定会执行的代码
try: print(11111) # l = [] # l[2] int('a') print(222222) except Exception as e:print(e) else: print('执行else了') # 如果try语句中的代码都顺利执行了,没有报错,那么执行else的代码 finally:print('执行finally了') # 不管前面的代码,finally一定会执行
总结:
try: pass # 可能有问题的代码 except ValueError: pass# 能预料到的错误 except Exception as e:print(e) # 能处理所有的异常 else:pass # try中的代码没有错误的时候,执行的 finally:pass # 无论如何都会执行的 raise ValueError # 主动抛出异常
二、包
释义:一组py文件组成的文件夹,在这个文件夹里有一个__init__.py文件,这就是包。
__init__.py有什么用?
其实在调用一个模块时,就是调用了这个模块名的py文件,每个py文件下都有一个__init__.py文件,这是做什么用的呢?我们在调用这个模块前,首先调用的就是__init__.py文件,先执行他,然后再执行 模块名.py文件。
注:绝对导入和相对导入
带有相对导入路径的文件不能直接执行,因为不添加环境变量,代码执行会报错找不到这个模块或包,
三、网络编程
(下篇文章主要讲并发编程,这里对于1对1通信的网络编程,只记录模板并释义)
首先我们要导入一个socket模块
server端:
import socket # 买一个手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 给手机插卡 phone.bind(('127.0.0.1',8080)) # 手机开机,等电话 phone.listen(5) # 建立通话链接 conn,client_addr=phone.accept() # 收发通信数据 client_data = conn.recv(1024) print(client_data.decode('utf-8')) conn.send(client_data.upper()) # 挂电话,手机关机 conn.close() phone.close()
client端:
import socket # 手上有一个手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 拿手机给对方拨号 phone.connect(('127.0.0.1',8080)) # 发送数据 phone.send('hello'.encode('utf-8')) # 接收数据 server_data = phone.recv(1024) # 数据处理 print(server_data.decode('utf-8')) # 挂电话,关机 phone.close()
粘包问题:
粘包问题只发生在tcp协议下,而不发生在udp协议下。
在什么情况下会发生粘包?
在基于tcp通信,并连续发送两条数据是“可能”发生,即两条变一条发送过去了,并且发生粘包的条件是对端在接收数据时,接收bytes限制大于发送数据量。
如何避免粘包情况发生呢?
先制作报头,先发报头,对端准确无误接收报头,再发送数据。