python异常处理

什么是异常呢?

  异常既是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。就是程序在运行

过程中出现了不可预知的错误,一般情况下,在python无法正常处理程序时就会发生一个异常。并且

该错误没有对应的处理机制,那么就会以异常的形式表现出来;异常是python对象表示了一个错误,当

出现错误时我们需要去捕获它,否则程序就会终止运行

异常的种类分为两大类:

  1.语法错误

    是你在程序上能够立马解决的 但是这种错误不能被容忍 语法上的错误发现之后要立刻决。

  2.逻辑错误

    这种错误是可以被容忍的,因为一眼看不出来,针对逻辑上的错误可以采用异常处理机制进行捕获。

常见的错误类型:

OverflowError 数值运算超出最大限制
AttributeError 对象没有这个属性
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
NAMERROR 名字错误
SyntaxError 语法错误
ValueError 值错误
IndexError 索引错误
ImportError 导入模块/对象失败

  

如何避免异常呢:

  在我们认为可能出现bug的代码块上方try一下,要注意的是try内部的代码块越少越好

语句结构:

  try:

    可能出现的代码

  except  出错的类型 as f:  #  将保错信息赋值给变量f   as 后面跟的是自定义的变量名

    出错之后的处理机制

try:
    <statements>        #运行try语句块,并试图捕获异常
except <name1>:
    <statements>        #如果name1异常发现,那么执行该语句块。
except (name2, name3):
    <statements>        #如果元组内的任意异常发生,那么捕获它
except <name4> as <variable>:
    <statements>        #如果name4异常发生,那么进入该语句块,并把异常实例命名为variable
except:
    <statements>        #发生了以上所有列出的异常之外的异常
else:
<statements>            #如果没有异常发生,那么执行该语句块
finally:
    <statement>         #无论是否有异常发生,均会执行该语句块。

try-finally语句
  语法:
    try:
      可能触发异常的语句
    finally:
      最终语句
    说明:
      finally 子句不可以省略一定不存在except 子句
    作用:
      通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子

句都会被执行try-finally 语句不会改变程序的(正常/异常)状态

try:
    异常语句1
    异常语句2
    异常语句3
except Exception: # 万能异常  所有的异常类型都能捕获。
      其它异常处理语句
    else: 
      未发生异常语句
    finally:
      最终语句

    作用:
      偿式捕获异常,得到异常通知,将程序由异常流程转为正常流程并继续执行

UDP通信:

  UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法,也被称为数据

报协议,它自带报头,没有双向通道,通信类似于发短信,当数据接收方收到发送方传来的信息

时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否

则将一直等待直到收到确认信息为止。

  基于以上特性:

    udp协议客户端允许发送空包

    udp协议不会黏包

    Udp协议服务端不存在的情况下客户端照样不会报错  就是如果在从发送方到接收方的传递

过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。

    udp协议支持并发  并发就是在操作系统中,是指一个时间段有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。并发是看起来像同时运行。

UDP基本使用:

# 客户端.py文件演示:

import socket

client = socket.socket(type=socket.SOCK_DGRAM)
# 不需要建立连接  直接进入通信循环
server_address = ('127.0.0.1',8080)
while True:
    client.sendto(b'hello',server_address)
    data, addr = client.recvfrom(1024)
    print('服务端发来的数据',data)
    print('服务端的地址',addr)


# 服务端.py文件演示:

import socket

server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议
server.bind(('127.0.0.1',8080))
# UDP不需要设置半连接池 它也没有半连接池的概念
# 因为没有双向通道  不需要accept  直接就是通信循环
while True:
    data, addr = server.recvfrom(1024)
    print('数据:',data)  # 客户端发来的消息
    print('地址:',addr)  # 客户端的地址
    server.sendto(data.upper(),addr)

  

原文地址:https://www.cnblogs.com/sweet-i/p/11323827.html