从小白到小黑 python学习之旅 日常总结 34(异常处理 网络编程)

异常处理

 

什么是异常

异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止
异常处理的三个特征
异常的追踪信息
异常的类型
异常的内容
print('start....')
[1,2,3][1000]
print('stop...')


#start....
# 异常的追踪信息
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/当天/01 异常处理.py", line 10, in <module>
    [1,2,3][1000]
#异常的类型 #异常的内容
IndexError: list index out of range
#程序一旦出错就会抛出异常,程序的运行随即终止

为何处理异常
为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序
而是捕捉异常并处理:将出错信息记录到日志内

如何处理异常
语法上的错误SyntaxError
处理方式:必须在程序运行前就改正
if 1>3   #少了冒号
    print("run...")

# File "C:/Users/Administrator/Desktop/当天/01 异常处理.py", line 24
#    if 1>3
#         ^
#SyntaxError: invalid syntax

 


逻辑上的错误
# TypeError:数字类型无法与字符串类型相加
1+'2'

# ValueError:当字符串包含有非数字的值时,无法转成int类型
num=input(">>: ") #输入hello
int(num)

# NameError:引用了一个不存在的名字x
x

# IndexError:索引超出列表的限制
l=['egon','aa']
l[3]

# KeyError:引用了一个不存在的key
dic={'name':'egon'}
dic['age']

# AttributeError:引用的属性不存在
class Foo:
    pass
Foo.x

# ZeroDivisionError:除数不能为0
1/0

 


针对逻辑上的异常又分成两种处理方式

1.错误发生的条件是可以预知的,使用if判断来解决

#示例
age=input('>>: ').strip() # 输入的只要不是数字就会出错
age=int(age)
if age > 18:
    print('猜大了')
elif age < 18:
    print('猜大了')
else:
    print('猜对了')

#>>: aaa
#Traceback (most recent call last):
#  File "C:/Users/Administrator/Desktop/当天/01 异常处理.py", line 78, in <module>
#    age=int(age)
#ValueError: invalid literal for int() with base 10: 'aaa'


age=input('>>: ').strip() # 输入的只要不是数字就会出错
if age.isdigit():
    age=int(age)
    if age > 18:
        print('猜大了')
    elif age < 18:
        print('猜大了')
    else:
        print('猜对了')
else:
    print('必须输入数字')

#>>: aaa
#必须输入数字

 

 

2.错误发生的条件是无法预知的

print('start...')
try:
    # 有可能会抛出异常的代码
    子代码1
    子代码2
    子代码3
except 异常类型1 as e:  #e:异常的内容
    pass
except 异常类型2 as e:
    pass
...
else:
    如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
    无论被检测的子代码块有无异常发生,都会执行finally的子代码

print('end...')

 

 

print('start...')

try:
    print('1111111111')
    l = ['aaa', 'bbbb']
    l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
    print('2222222222')
    xxx
    print('33333333')
    dic = {'a': 1}
    dic['aaa']

except (IndexError, NameError) as e: #打印信息相同时 可以把异常类型 放一起
    print('异常的信息: ', e)
except KeyError as e:
    print('字典的key不存在: ', e)
except Exception as e:       #  万能异常  (所有的异常类型) 
    print('所有异常都可以匹配的到')
print('end....')


#start...
#1111111111
#异常的信息:  list index out of range
#end....

 


else不能单独与try配合使用,必须要搭配except
print('start...')

try:
    print('1111111111')
    print('2222222222')
    print('33333333')
# except Exception as e:  # 匹配的到')
else:
    print('====>')

print('end....')


#  File "C:/Users/Administrator/Desktop/当天/01 异常处理.py", line 175
#    else:
#    ^
#SyntaxError: invalid syntax

 

 


finally可以单独与try配合使用
print('start...')

try:
    print('1111111111')
    l = ['aaa', 'bbbb']
    l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
    print('2222222222')
    xxx
    print('33333333')
    dic = {'a': 1}
    dic['aaa']
finally: # 不处理异常,无论是否发生异常都会执行finally的子代码
    print('====》》》》》应该把被检测代码中回收系统资源的代码放到这里')

print('end....')

#start...
#1111111111
#====》》》》》应该把被检测代码中回收系统资源的代码放到这里
#Traceback (most recent call last):
#  File "C:/Users/Administrator/Desktop/当天/01 异常处理.py", line 186, in <module>
#    l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
#IndexError: list index out of range

 

 

网路编程







B/S架构也是C/S架构的一种

市面上已经有很多用户已经习惯的主流浏览器软件 所以客户端浏览器软件我们可以不用写了 就写
服务端就行了


网络通信

网络存在的意义就是跨地域数据传输>>>称之为通信
网络=物理链接介质+互联网通信协议(定义计算机如何接入internet,以及接入internet的计算机通信的统一标准)


所有的计算机都学会了互联网协议,那所有的计算机都就可以按照统一的标准去收发信息从而完成通信了

 

OSI七层协议




协议:规定数据的组织格式

格式:报头+数据部分



tcp/ip五层


用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解


 

物理层:负责发送电信号(单纯的电信号毫无意义,必须对其进行分组)

一组物理层数据称之为:位



数据链路层:ethernet以太网协议

规定1:一组数据称之为一个数据帧
规定2:数据帧分成两部分>>>头+数据
头包含:源地址与目标地址,该地址是mac地址
数据包含:包含的是网络层发过来的整体的内容

规定3:规定但凡接入互联网的主机必须有一块网卡,每块网卡在出厂时都烧制好一个全世界独一无二的地址,该地址称之为 mac地址

注意:以太网协议的工作方式是广播



网络层IP协议

要达到的目的:划分广播域
每一个广播域但凡要接通外部,一定要有一个网关帮内部的计算机转发包到公网
网关与外界通信走的是路由协议

规定1:一组数据称之为一个数据包
规定2:数据帧分成两部分>>>头+数据
头包含:源地址与目标地址,该地址是IP地址
数据包含的:传输层发过来的整体的内容

 

 

 

 一个合法的ipv4地址组成部分=ip地址/子网掩码地址

    172.16.10.1/255.255.255.0
    172.16.10.1/24

 

 

ip地址的第四个版本:ipv4

8bit.8bit.8bit.8bit
最小:0.0.0.0
最大:255.255.255.255


子网掩码:

所谓”子网掩码”,就是表示子网络特征的一个参数
    8bit.8bit.8bit.8bit

    255.255.255.0对应的二进制表达
11111111.11111111.11111111.00000000

所以说172.16.10.1/24 的24 是指24个1  如果不写默认就是24

 网络地址 :

就是将ip地址与子网掩码 进行AND运算(两个数位都为1,运算结果为1,否则为0)

ip地址             172.16.10.1:          1 0 1 0 1 1 0 0. 0 0 0 1 0 0 0 0. 0 0 0 0 1 0 1 0. 0 0 0 0 0 0 0 1

子网掩码          255.255.255.0:       1 1 1 1 1 1 1 1. 1 1 1 1 1 1 1 1. 1 1 1 1 1 1 1 1. 0 0 0 0 0 0 0 0

网络地址                                         1 0 1 0 1 1 0 0. 0 0 0 1 0 0 0 0. 0 0 0 0 1 0 1 0. 0 0 0 0 0 0 0 0 >>>172.16.10.0

 

ARP协议

 

 arp协议功能:广播的方式发送数据包,获取目标主机的mac地址( 就是发送端 发送了数据包到目标端的ip地址  然后目标端ip地址的主机解析数据包 得出mac地址并返回 )



两台计算机在同一个局域网内

ARP:
1、计算二者网络地址,如果一样
2、发送广播包
发送端mac FF:FF:FF:FF:FF:FF 发送端ip地址,目标ip地址 数据
3、局域网内的收到广播包的计算机 解包并返回



两台计算机不在同一个局域网内
ARP:
1、计算机二者网络地址,如果不一样
2、发送广播包到网关的mac地址
发送端mac 网关的mac地址 发送端ip地址,目标ip地址 数据
(发送端mac FF:FF:FF:FF:FF:FF 发送端ip地址,目标ip地址 数据)
3、目标ip地址局域网内的收到数据包的计算机 解包并返回

 

总结******

ip地址+mac地址>>>标识全世界范围内独一无二的一台计算机


或者:
ip地址+ARP>>>标识全世界范围内独一无二的一台计算机

 


 

posted @ 2020-04-16 18:33  It's_cool  阅读(278)  评论(0)    收藏  举报