028.异常处理与socket编程

一、异常处理

(一)什么是异常处理

​ 异常是程序运行错误发出的信号(若未进行处理异常,则会抛出异常,程序随之终止)。

(二)异常处理的组成及异常的种类

1.异常处理的三个组成:

​ 异常追踪信息——>具体报错的位置;

​ 异常种类——>逻辑错误or语法错误;

​ 异常内容——>异常的内容信息。

2.异常的两个种类:

(1)语法异常:

​ SyntaxError,python代码非法,严重的错误,不可以发生。

(2)逻辑异常:

​ 除语法异常外的其他异常,常见的异常有:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

​ 更多其他的异常:

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

(三)为何会有异常

​ 为了增强程序的健壮性。

(四)如何处理异常

1.针对语法错误:

​ 应该在程序运行前立即改正。

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)如果逻辑错误发生的条件是不可预知的,那么异常一个会发生,考虑到程序的健壮性,我们应该做好补救措施。使用try…except语句:

try:
    代码块
except 错误类型:
	处理异常的代码块
...
finally:
    代码块(一定会运行)

​ try…except语句的具体用法:

① 异常处理只能用来处理指定的异常情况,如果非指定异常则无法处理:

# 例1
try:
    print("====>111")
    print("====>222")
    xxx            
    print("====>333")
except AttributeError as e:  # NameError: name 'xxx' is not defined
    print(e)

print('====>4')

② 有了针对性的异常处理,相关语句运行到错误位置即停止运行,异常捕捉语句之外的,可以正常运行:

# 例2
try:
    print("====>111")
    print("====>222")
    xxx
    print("====>333")
except NameError as e:   # name 'xxx' is not defined
    print(e)  

print('====>4')

③ 多分支异常捕捉,以及多个异常捕捉写在一个语句中:用于针对不同异常定制不同的处理逻辑。

# 例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:   # 'k1'
    print(e)

print('====>4')

④ 万能异常Exception :可以捕捉任意种类的异常,使用同一段代码逻辑处理异常。

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)

⑤ 多分支结构后+Exception,可以组合使用

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)

⑥异常的其他结构:使用finally, 用于回收资源。其后代码一定会运行

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('无论异常与否,都会执行该模块,通常是进行清理工作')

⑦主动触发异常:当程序运行到该位置,主动触发异常,后续代码不运行

作用:用于制定规范,如帮助鸭子类型进行规范化的限定

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

#########——————用于鸭子类型限定规范
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()  # BaseException: 小垃圾必须实现speak方法来覆盖
d.run()

⑧自定义异常:可以基于BaseException自定义一个类,用来主动触发异常

# 例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)  # __main__.Interface: <接口异常:11:22:33>

⑨***断言:assert 条件

作用:用于调试时使用,上下两段代码不同人编写,条件不成立时,主动抛出异常。

#########——————限定条件触发异常基本用法,if判断,后续代码需要缩进,使用起来不方便
print("====1")
print("====2")
print("====3")
salaries = [1.1, 2.2]

if len(salaries) != 3:
    raise NameError    # NameError
    print(salaries[2])
    print(salaries[2])
    print(salaries[2])
#########——————限定条件触发异常断言用法,分段测试,断言成功不影响代码运行,且断定之前代码无误,后续代码继续测试、排查。
print("====1")
print("====2")
print("====3")
salaries = [1.1, 2.2]

assert len(salaries) == 3

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

⑩总结try…except:

1) 把错误的代码和真正的工作分开来;

2) 代码更易组织,更清晰,复杂的工作任务更容易实现;

3) 有了此方法后更安全了,不至于由于一些小的上述导致程序意外崩溃。

二、socket编程初探

(一)什么是socket

​ socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,socket相当于一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的Socket接口就是全部,让Socket去组织数据,以符合指定的协议。

(二)为何要学习socket编程

​ 为了能够基于socket开发一个C/S或B/S结构的软件。

	Client————————网络————————Sever
    Browser————————网络————————Sever

(三)如何实现基于socket编程

1.参考大神的博客

​ https://www.cnblogs.com/linhaifeng/articles/5937962.html

2.网络是什么?

​ 网络=底层的物理介质+互联网通信协议

​ OSI七层协议

3.网络存在的意义:

​ 通信

(四)OSI七层协议了解

1.互联网协议按照功能的不同,分为osi七层或tcp/ip五层或tcp/ip四层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KX3HQ5E7-1597062314973)(D:\Onedrive\文档\01学习资料\全栈15博客笔记\python学习博客及作业\day028.异常处理及网络基础\1.OSI七层协议.png)]

2.每层常见的物理设备:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QzT8qcui-1597062314974)(D:\Onedrive\文档\01学习资料\全栈15博客笔记\python学习博客及作业\day028.异常处理及网络基础\1.每层常见的物理设备.png)]

3.OSI七层数据协议数据传输时的封包与解包过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ow1kzD3i-1597062314975)(D:\Onedrive\文档\01学习资料\全栈15博客笔记\python学习博客及作业\day028.异常处理及网络基础\03.OSI七层协议数据传输、封包与解包过程.gif)]

​ https://www.cnblogs.com/linhaifeng/articles/5937962.html

2.网络是什么?

​ 网络=底层的物理介质+互联网通信协议

​ OSI七层协议

3.网络存在的意义:

​ 通信

(四)OSI七层协议了解

1.互联网协议按照功能的不同,分为osi七层或tcp/ip五层或tcp/ip四层

[外链图片转存中...(img-KX3HQ5E7-1597062314973)]

2.每层常见的物理设备:

[外链图片转存中...(img-QzT8qcui-1597062314974)]

3.OSI七层数据协议数据传输时的封包与解包过程

[外链图片转存中...(img-ow1kzD3i-1597062314975)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值