day27 异常处理 和 网络协议
元类补充
class MyMeta(type):
# 用于新建类对象
def __new__(cls,*args,**kwargs)
print(MyMeta)
print(*args)
# 调用type通过的__new__方法来创建一个空的类对象,已经将类的三个组成部分都放到类对象中了
res=type.__new__(cls,*args,**kwargs)
def __init__(self,class_name,bases,namespace):
print('init run')
print(self)
class Student(metaclass = MyMeta):
def f1():
print('nice')
new 与 init的区别
__new__ 比__init__先执行 其作用是创建一个空的类对象
作为一个类对象 必须具备是三个组成部分 所以调用type中的__new__来完成组装
得到这个类对象后需要将其返回 以供__init__来使用
1.异常护理 *****
什么是异常
指的是 与正常情况不同
在程序中 程序的正常执行过程 按照代码顺序 一行一行很执行 直到所有代码都执行完
如果在执行过程中 出现了错误 导致代码无法执行完毕 就称之为异常
即 异常其实就是代码执行过程中出错了
常见的异常
当异常发生时 解释器 会打印异常详细信息 并且终止程序的执行
如何排查排查错误
1.定位到错误发生的位置
查看追踪信息
1.如果你的代码都是自己写的 没有调用任何内置模块或方法 那么错误发生位置一定在最后一行
2.如果你的代码调用其他模块的方法
1.是系统内置的模块 例如抛出位置object.py 不用去查看object类 它几乎不可能出错
一定是你自己代码在调用时出了错误
2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
绝招:如果有很多追踪信息 找最后一行是你自己写代码的位置
2.查看异常类型 例如:IndexError
3.查看异常的值 例如: list index out of range
如果没有任何异常信息 但是程序就是不对 可以使用
排除法,把程序一步一步注释起来执行
异常的三个组成部分
追踪信息
异常类型
异常的值
异常一旦发生就会导致程序终止 这对于用户而言体验极差 所以我们需要有一种机制
能够防止程序因为异常而终止
a =
# SyntaxError: invalid syntax 语法错误
age
# NameError: name 'age' is not defined 名字不存在
open("asasasas")
# FileNotFoundError: [Errno 2] No such file or directory: 'asasasas' 路径错误
f = open("1.今日内容")
f.close()
f.read()
#ValueError: I/O operation on closed file. 文件已经关闭 你还要去读写
f = open("1.今日内容",mode="rt",encoding="utf-8")
f.write("123")
# io.UnsupportedOperation: not writable 不能写入数据 读写模式错误导致
int("abc")
# ValueError: invalid literal for int() with base 10: 'abc' 数据的值错误导致
def func():
print(1)
print(2)
# IndentationError: unexpected indent 缩进错误
li = []
li[1]
# IndexError: list index out of range 索引不存在
dic = {}
dic["name"]
# KeyError: 'name' key不存在
异常可以由 发生的时间不同分为两类
1.语法检测异常
解释器在执行代码前会先检测语法 检测通过才会开始执行
如果这个阶段发生了异常 代码一行都不会执行
语法错误 和 缩进错误
这种低级错误 就别问了
2.运行时异常
已经通过了语法检测 在解析执行期间发生的异常
# print("start")
# a = int("abc")
# print("over")
li = []
# # 语法1
# try:
# # 把可能发出错误的代码放到try中
# print("start")
# a = int("abc")
# li[1]
# print("over")
#
# except ValueError:
# # 当try中真的发生了错误 就会执行 except中的代码
# # 在这里可以做一些补救措施
# print("发生了 ValueError异常")
#
# print("over")
# # 语法2 except可以有多个
try:
# 把可能发出错误的代码放到try中
print("start")
a = int("abc")
li[1]
print("over")
except ValueError:
# 当try中真的发生了错误 就会执行 except中的代码
# 在这里可以做一些补救措施
print("发生了 ValueError异常")
except IndexError:
print("发生了 IndexError 索引不正确")
print("over")
# 语法4 万能异常 Exception类 尽量少用 可能会导致 程序既不报错 也不正常运行 无法定位错误位置
try:
# 把可能发出错误的代码放到try中
print("start")
# a = int("abc")
# li[1]
10 / 0
dic = {}
dic["name"]
print("over")
except Exception:
print("可能是任何类型的错误 反正是发生错误了")
print("over")
# 语法5 万能异常 Exception类 建议 输出异常的值
try:
# 把可能发出错误的代码放到try中
print("start")
# a = int("abc")
li[1]
# 10 / 0
dic = {}
dic["name"]
print("over")
# 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
except Exception as e:
print("可能是任何类型的错误 反正是发生错误了")
print(e)
print(type(e))
print("over")
# # 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型
try:
# 把可能发出错误的代码放到try中
print("start")
# a = int("abc")
# li[1]
10 / 0
dic = {}
dic["name"]
print("over")
except ValueError:
print("值不对.....")
except ZeroDivisionError:
print("除数不能为0")
# 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
except Exception as e:
print("可能是任何类型的错误 反正是发生错误了")
print(e)
print(type(e))
print("over")
# 语法7 try except else
try:
# 把可能发出错误的代码放到try中
print("start")
# a = int("abc")
li[1]
# 10 / 0
dic = {}
# dic["name"]
print("over")
except ValueError:
print("值不对.....")
except ZeroDivisionError:
print("除数不能为0")
# 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
except Exception as e:
print("可能是任何类型的错误 反正是发生错误了")
print(e)
print(type(e))
else: #当没有发生异常会执行else 只能except的后面
print("执行了else")
print("over")
# 语法8 try except finally
try:
# 把可能发出错误的代码放到try中
print("start")
a = int("abc")
# li[1]
# 10 / 0
dic = {}
# dic["name"]
print("over")
except ValueError:
print("值不对.....")
else:
print('else')
finally: #无论是否发生异常 最后都会执行finally中的代码
print("finally")
print("over")
import io
# finally的使用场景 可以用finally来执行一些清理操作 类似__del__
try:
print("start")
f = open("1.今日内容","rt",encoding="utf-8")
f.read()
f.write('aaa')
print("end")
except FileNotFoundError:
print("文件路径错误...")
except io.UnsupportedOperation:
print("文件不能被写入....")
finally:
f.close()
print(f.closed)
完整的书写顺序
try
except
else
finally
你需要掌握的语法
1.
try:
except:
2.
try:
except:
finally:
正确使用异常处理
1.如果明确指定异常发生原因,就不要产生异常,使用if判断等方式
2.不知道异常发生的原因,但是知道异常的类型,那就明确捕获该类型的异常
3.不知道发生原因,也不知道异常的类型,可以使用万能异常,但是一定要打印异常消息,方便了解异常信息
做一个登录功能 如果登录失败就抛异常
主动抛出异常
# 当你写了一些功能 是提供给别人用的 然而使用者不按照你的方式来使用,就会导致程序出错
# 而且我们无法帮助用户处理这个错误
# 这时候就可以主动抛出异常
# raise 关键字 后面跟 任意Exception类型的子类
# 自定义异常类型
class LoginException(Exception):
pass
def login():
name = input("username:").strip()
pwd = input("password:").strip()
if name == "blex" and pwd == "123":
print("登录成功!")
else:
raise LoginException("用户名或密码不正确....")
login()
断言
其实就是断定的意思,我很确定某个条件一定成立
有一段代码,要执行必须要保证某个条件是成立的
# 有一堆姓名 需要被处理
names = ["张三","李四","王麻子"]
names = []
# 一定要保证列表中有数据需要被处理
if not names:
raise TypeError("没有数据需要处理....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
names = [1]
# 使用断言来简化代码 断言后面跟一个bool类型表达式 如果结果为True则继续往下执行
# 否则直接抛出异常 AssertionError
# 其局限性是 异常类型是固定的 而且不能指定异常信息
# assert 1
assert names
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
2.网络协议 ****
以太网协议
规定了一组电信号为帧,最大1518字节
一个数据帧由head和data组成
规定每个电脑必须有mac地址,它是全球唯一的
有了地址以后能够通过广播的方式来传输数据
广播太多会造成广播风暴,交换机会自动学习,可以降低广播的次数
day27 异常处理 和 网络协议的更多相关文章
- 网络协议,socket模块
"""网络通讯要素:1.物理介质2.通讯协议 osi五层模型 应用层 传输层 网络层 数据链路层 物理层 物理层能传输010101二进制单纯的二进制是没有意义的,必须得知 ...
- day28 网络协议OSI 及socket模块
反射都是操作对象中的__dict__的内容 class Student: def study(self): print("正在学习....") stu = Student() if ...
- PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
Python黑帽编程1.5 使用Wireshark练习网络协议分析 1.5.0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...
- 基础笔记(三):网络协议之Tcp、Http
目录 一.网络协议 二.TCP(Transmission Control Protocol,传输控制协议) TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具 三.HTTP(Hyper ...
- C# RFID windows 服务 网络协议方式
上篇话说是串口方式操作RFID设备. 下面介绍网络协议方式. 设备支持断线重连. 那我们的服务也不能差了不是. 所以这个服务类也是支持的哦. 不解释上代码: namespace Rfid { /// ...
- CCNA网络工程师学习进程(3)常规网络设计模型与基本的网络协议
本节介绍分层的网络设计模型与基本的网络协议,包括ARP协议,ICMP协议和IP协议. (1)三层网络架构: 一个好的园区网设计应该是一个分层的设计.一般分为接入层.汇聚层(分布层).核 ...
- 对TCP/IP网络协议的深入浅出归纳
前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...
- linux网络协议
网络协议 本章节主要介绍linxu网络模型.以及常用的网络协议分析以太网协议.IP协议.TCP协议.UDP协议 一.网络模型 TCP/IP分层模型的四个协议层分别完成以下的功能: 第一层 网络接口层 ...
- CcTalk (网络协议)(转)
ccTalk (发音作"see-see-talk")是一种广泛使用的串行协议,遍及货币交易和销售时点情报系统行业.如硬币和纸币验钞机等外部设备在多元化的自动支付设备如交通,票务,投 ...
随机推荐
- 调整navigationItem的位置
UIBarButtonItem *itemTransformView = [[UIBarButtonItem alloc] initWithCustomView:_header.transformVi ...
- geiUItabBarItem设置图片颜色和title颜色
设置图片颜色 tabBarVCtrl.tabBar.selectedImageTintColor = [UIColor greenColor];//设置tabBarItem选中时的字图颜色,iOS 8 ...
- ant 小结
ant 的配置文件是xml 格式的. 其xml根元素是 project project元素下面有 property path env target filelist patternset 其中 tar ...
- java double 保留x位小数
以下是保留两位的例子 public class Test1 { public static void main(String[] args) { double a = 123450; double d ...
- hive 索引
hive 有限的支持索引,不支持主键外键,可以对表添加索引,也可以为某个分区添加索引.维护索引也要额外的存储空间和计算资源. 创建索引需要指定索引处理器 如 as 'org.apache.hadoop ...
- php 中文转拼音,可以只转首字母,可以设置utf8、gbk
<?php class Pinyin { /** * 默认是gb编码,第二个参数随意设置即为utf8编 * @param type $isInitial 是否只返回首字母 * @return t ...
- jquery 设计的思路-----初级
jquery.js 很经典,其中有一些设计思路简直非常经典 1.安全的创建一个构造函数并进行调用: <script> // 这是一种安全的构造函数的创建方法,在调用构造函数G的时候,不论使 ...
- js 引入外部文件之 script 标签
在我的理解看来,html 就是一个单纯的管显示问题,js就是单纯的管动作问题,css就是单纯的管布局问题,这三个构成了一个网页 在HTML中,经常会用到引入js 文件. 引入js的方法很简单: 1. ...
- UNITY2018开启deepprofiling
ADB方式调试游戏步骤 前提: 1,手机开启 [开发者模式][USB调试] 2,数据线连接手机和电脑 3,安装adb(注意adb版本不对可能导致adb deveices找不到设备,那就换个adb版本) ...
- 从初始化列表和构造函数谈C++的初始化机制
来源:http://blog.csdn.net/theprinceofelf/article/details/20057359 前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头 ...