Python中的异常处理和套接字编程Socket

Python学习之从入门到放弃,喜欢的可以关注一下哦。

异常处理

1 什么是异常?

  • 异常是错误发生的信号,一旦程序出错就会产生一个异常。
  • 如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止

异常的组成部分:

1.具体哪一行代码抛出的异常

2.异常的种类

NameError:变量名没有定义过
IndexError:索引不存在
   l=[11,22]
   l[100]
KeyError
   d={"k1":11}
   d["k2"]
AttributeError:对象属性不存在
   对象.属性
ValueError:
   int("asdf")
TypeError:
   "asdf"+1111
ZeroDivisionError
   1/0
等等....

3.异常的内容信息

示例:代码报错内容

Traceback (most recent call last):
  File "E:/code/s15-day28/01 异常处理.py", line 195, in <module>
    assert len(salaries) == 3
AssertionError

2 为什么要去处理异常

为了增强程序的健壮性

3 如何处理异常

1. 针对语法错误的异常:

应该在程序运行以前立即改正。(不可犯错误)

2.针对逻辑错误的异常:

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.2 如果逻辑错误发生的条件是不可预知的,那么异常一定会发生,

考虑到程序的健壮性
我们应该处理异常,做好补救措施

try:
    代码块
except 异常的类型:
    发生异常后要执行的代码

示例异常处理:

1.接收的异常必须是程序所抛出的异常:

try:
    print("====>111")
    print("====>222")
    xxx  #异常处
    print("====>333")
except AttributeError as e:
    print(e)

print('====>4')

结果:

====>111
====>222
Traceback (most recent call last):
  File "E:/code/s15-day28/01 异常处理.py", line 64, in <module>
    xxx
NameError: name 'xxx' is not defined   
#异常类型是NameError 不是AttributeError 所以异常没有被接收到。

2.用正确的异常报错去接收抛出的异常:

try:
    print("====>111")
    print("====>222")
    xxx
    print("====>333")
except NameError as e:
    print(e)
print('====>4')

结果:

====>111
====>222
name 'xxx' is not defined
====>4
as e 表示的是接收所抛出的异常,并且赋值给e
再打印出来用    print(e)

3.多异常接收 1:

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:
    print(e)

print('====>4')

结果

====>111
====>222
'k1'
====>4
#如果把 xxx 解除注释。我们需要注意,不会执行下面其他的异常,只会执行NameError异常

====>111
====>222
=----> name 'xxx' is not defined
====>4

4.finally:

try:
    print("====>111")
    print("====>222")
    xxx=111
    # l=[]
    # l[0]
    dic={}
    # dic["k1"]
    print("====>333")
except (NameError,IndexError) as e:
    print("=---->",e)
except KeyError as e:
    print(e)
finally:
    print("一定会运行")
print('====>4')
print(xxx)

结果:

====>111
====>222
====>333
一定会运行   #不管程序报不报错,都会执行finally 
====>4   
111
#还有我们要注意在try 中的代码还是顶级代码,可以看print(xxx)这个代码

注意:

无论异常与否,都会执行该模块,通常是进行清理工作

5.万能异常 Exception:

try:
    print("====>111")
    print("====>222")
    # xxx
    l=[]
    # l[0]
    dic={}
    dic["k1"]
    print("====>333")
except Exception as e:
    print("万能异常",e)
print('====>4')

结果

====>111
====>222
万能异常 'k1'
====>4

6.主动触发异常 raise:

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

结果

Traceback (most recent call last):
  File "E:/code/s15-day28/01 异常处理.py", line 144, in <module>
    raise NameError("变量名未定义")
NameError: 变量名未定义
==>11

主动触发异常的应用场景:

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()
d.run()

p.speak()
d.run()

在公司里多人一起写代码的时候,我们可以适用报异常的方法,希望适用鸭子类型去定义类,那么我们就必须要每个类中都有相对应的代码,用主动触发异常的方式可以提醒各位,需要取覆盖此功能。就不必我们去调用abc模块了

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)

结果

Traceback (most recent call last):
  File "E:/code/s15-day28/01 异常处理.py", line 181, in <module>
    raise Interface("接口异常", 11, 22, 33)
__main__.Interface: <接口异常:11:22:33>

8.断言:assert 条件

salaries=[1984,2752]

# if len(salaries) != 3:
#     raise NameError
assert len(salaries) == 3
print(salaries[0])
print(salaries[1])
print(salaries[2])

结果

Traceback (most recent call last):
  File "E:/code/s15-day28/01 异常处理.py", line 190, in <module>
    assert len(salaries) == 3
AssertionError   #断言错误。

其实断言效果就是相当于if判断。

9.总结try…except

  • 1:把错误处理和真正的工作分开来
  • 2:代码更易组织,更清晰,复杂的工作任务更容易实现
  • 3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了

套接字编程

1.什么是socket?

网络基础=》socket

2、为何要学习socket编程:

基于socket开发一个C/S或者B/S结构的软件

Client---------网络------------Server
Browser--------网络------------Server

3、如何基于socket编程

**网络:**https://www.cnblogs.com/linhaifeng/articles/5937962.html

3.1网络是什么?

底层的物理连接介质+互联网通信协议
OSI七层协议

3.2网络存在的意义是什么?

通信

4、OSI七层协议

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

如图:
在这里插入图片描述

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

如图:
在这里插入图片描述

努力学习!
原文地址:https://www.cnblogs.com/Orange-YXH/p/13648104.html