异常处理:
错误:
1.语法错误:程序运行检测到语法错误会直接抛出,并终止程序运行。
2.逻辑错误:程序在运行中遇到逻辑错误,系统会询问程序是否处理异常,程序没有处理系统会抛出异常,并终止程序运行。
异常:
程序运行过程中发生的错误。
异常分为三部分:
追踪信息,异常类,异常值。
n = input(‘>>>: ‘).strip() s = n + 1 print(s) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-23/day23.py >>>: 1 Traceback (most recent call last): File "E:/Python/DAY-23/day23.py", line 7, in <module> <----追踪信息 s = n + 1 TypeError: must be str, not int 异常类 异常值 Process finished with exit code 1
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
常用异常
异常的处理方式:
1.if 处理:错误发生前处理,防止错误发生
2. try处理:错误发生后处理,捕捉异常进行处理
try的用法:
当try含多个异常时,当遇到第一个异常就会跳出try内的代码执行,去匹配except的异常处理。
使用try 和 except 来包裹可能发生错误的代码,使用except 来指定捕捉的 错误类型 如下代码:
try: n = input(‘>>>: ‘).strip() s = n + 1 print(s) except TypeError: print(‘-------------‘) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-23/day23.py >>>: 1 ------------- Process finished with exit code 0
支持分支捕捉异常,类似if elif
else:当try内的代码没有异常时则执行 else 后面的命令。
finally:不管try内的代码有没有异常发生都执行
s1 = ‘hello‘ try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) #except Exception as e: # print(e) else: print(‘try内代码块没有异常则执行我‘) finally: print(‘无论异常与否,都会执行该模块,通常是进行清理工作‘)
主动抛出异常(raise):
主动抛出一个指定的类型的错误。
try: n = input(‘>>>: ‘).strip() s = int(n) + 1 raise TypeError except TypeError: print(‘----raise 抛出的 Type Error---------‘) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-23/day23.py >>>: 1 ----raise 抛出的 Type Error--------- Process finished with exit code 0
自定义异常类:
class LdslyError(BaseException): #定义错误类型的名字,继承 BaseException def __init__(self,msg): self.msg=msg try: raise LdslyError(‘test‘) except LdslyError as e: print(e)
socket:
客户端/服务端架构
即C/S架构。程序分为两部分,客户端和服务端两部分,客户端向服务端发送请求,服务端给客户端回应相应的信息。通过网络来连接客户端和服务端两部分。
socket在计算机的什么位置:
socket的工作流程:
上图 write和read形成的循环,称为通信循环。
一个简单的客户端发送命令,服务端执行命令并返回命令的执行结果:
#服务端import socket import subprocess server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立服务 server.bind((‘127.0.0.1‘,8080)) #监听IP和端口 server.listen(5) print(‘server run..........‘) while True: conn,client_addr=server.accept() #等待客户端连接,建立连接对象conn print(client_addr) #打印客户端连接信息 while True: try: client_msg = conn.recv(1024) #接收客户端消息 res = subprocess.Popen(client_msg.decode(‘utf-8‘),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout = res.stdout.read() stderr = res.stderr.read() conn.sendall(stdout+stderr) print(client_msg.decode(‘utf-8‘)) #打印客户端消息 # conn.send(‘hi‘.encode(‘utf-8‘)) #发送给客户端消息 except Exception: break conn.close() #关闭连接 server.close() #关闭服务
#客户端 import socket client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立客户端 client.connect((‘192.168.16.108‘,8080)) #客户端连接 服务端的ip地址跟端口 while True: cmd = input(‘>>>:‘).strip() if not cmd:break client.send(cmd.encode(‘utf-8‘)) #向服务端端发送信息 server_msg = client.recv(1024) #接受服务端的回复 print(server_msg.decode(‘gbk‘)) #打印服务端信息 client.close() #关闭连接
时间: 2024-10-14 12:32:03