Python面向对象——1、什么是异常 2、为何处理异常 3、如何处理异常? 4、何时使用异常处理 网络编程的一些预备知识

异常

1、什么是异常

异常是程序发生错误的信号。程序一旦出现错误,便会产生一个异常,若程序中没有处理它,就会抛出该异常,程序的运行也随之终止。在Python中,错误触发的异常如下 而错误分成两种,一种是语法上的错误SyntaxError,这种错误应该在程序运行前就修改正确

>>> if  
  File "<stdin>", line 1
    if
     ^
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

2、为何处理异常

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

3、如何处理异常?

3.1 语法上的错误SyntaxError, 处理方式一:必须在程序运行前就改正

if 1 > 3
print("run...")

3.2 逻辑上的错误

print(x)

l = ['a', 'b']
l[2]


1/0

int('abc')

dic = {'name': 'egon'}
dic['age']


class Foo:
    pass


Foo.x

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

  1. 错误发生的条件是可以预知的,使用if判断来解决
age = input('>>: ').strip()  # 输入的只要不是数字就会出错
if age.isdigit():
    age = int(age)
    if age > 18:
        print('猜大了')
    elif age < 18:
        print('猜大了')
    else:
        print('猜对了')
else:
    print('必须输入数字')
  1. 错误发生的条件是无法预知的
print('start...')
try:
    # 有可能会抛出异常的代码
    子代码1
    子代码2
    子代码3
except 异常类型1 as e:
    pass
except 异常类型2 as e:
    pass
...
else:
    如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
    无论被检测的子代码块有无异常发生,都会执行finally的子代码

print('end...')

如果我们想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配

try:
    被检测的代码块
except (NameError,IndexError,TypeError):
    触发NameError或IndexError或TypeError时对应的处理逻辑
举例

def convert_int(obj):
    try:
        res=int(obj)
    except (ValueError,TypeError):
        print('argument must be number or numeric string')
        res=None
    return res

convert_int('egon') # argument must be number or numeric string
convert_int({'n':1}) # argument must be number or numeric string

如果我们想捕获所有异常并用一种逻辑处理,Python提供了一个万能异常类型Exception

try:
    被检测的代码块
except NameError:
    触发NameError时对应的处理逻辑
except IndexError:
    触发IndexError时对应的处理逻辑
except Exception:
    其他类型的异常统一用此处的逻辑处理

在内置异常不够用的情况下,我们可以通过继承内置的异常类来自定义异常类

class PoolEmptyError(Exception): # 可以通过继承Exception来定义一个全新的异常
    def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法
        super(PoolEmptyError,self).__init__()
        self.value=value

    def __str__(self): # 可以定义该方法用来定制触发异常时打印异常值的格式
        return '< %s >' %self.value


class NetworkIOError(IOError): # 也可以在特定异常的基础上扩展一个相关的异常
    pass


raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted >
raise NetworkIOError('连接被拒绝') # __main__.NetworkIOError: 连接被拒绝

最后,Python还提供了一个断言语句assert expression,断定表达式expression成立,否则触发异常AssertionError,与raise-if-not的语义相同,如下

age='18'

# 若表达式isinstance(age,int)返回值为False则触发异常AssertionError
assert isinstance(age,int)

# 等同于
if not isinstance(age,int):
    raise AssertionError

4、何时使用异常处理

在了解了异常处理机制后,本着提高程序容错性和可靠性的目的,读者可能会错误地认为应该尽可能多地为程序加上try…except…,这其是在过度消费程序的可读性,因为try…except本来就是你附加给程序的一种额外的逻辑,与你的主要工作是没有多大关系的。
​ 如果错误发生的条件是“可预知的”,我们应该用if来进行”预防”,如下

age=input('input your age>>: ').strip()
if age.isdigit(): # 可预知只有满足字符串age是数字的条件,int(age)才不会触发异常,
    age=int(age)
else:
    print('You must enter the number')

如果错误发生的条件“不可预知”,即异常一定会触发,那么我们才应该使用try…except语句来处理。例如我们编写一个下载网页内容的功能,网络发生延迟之类的异常是很正常的事,而我们根本无法预知在满足什么条件的情况下才会出现延迟,因而只能用异常处理机制了

import requests
from requests.exceptions import ConnectTimeout # 导入requests模块内自定义的异常

def get(url):
    try:
        response=requests.get(url,timeout=3)#超过3秒未下载成功则触发ConnectTimeout异常
        res=response.text
    except ConnectTimeout:
        print('连接请求超时')
        res=None
    except Exception:
        print('网络出现其他异常')
        res=None
    return res

get('https://www.python.org')

网络编程的一些预备知识

# 1、CS架构与BS架构
Client<===========>Server

客户端软件send             服务端软件recv
操作系统                   操作系统
计算机硬件<====物理介质=====>计算机硬件


Browser<===========>Server


# 2、网络通信
网络存在的意义就是跨地域数据传输=》称之为通信
网络=物理链接介质+互联网通信协议


# 3、OSI七层协议
五层协议
    应用层
    传输层
    网络层
    数据链路层
    物理层

协议:规定数据的组织格式
    格式:头部+数据部分

    封包裹的过程:数据外加头
    拆包裹的过程:拆掉头获取数据

#4、五层协议
计算机1:                            计算机2:

应用层                               应用层
传输层                               传输层
网络层                               网络层
数据链路层                            数据链路层
物理层  <===========交互机===========> 物理层
                                     0101010101010

(源mac地址,目标mac地址)(源ip地址,目标ip地址)数据


#4.1 物理层负责发送电信号
一组物理层数据称之为:位
单纯的电信号毫无意义,必须对其进行分组


#4.2 数据链路层:ethernet以太网协议
规定1:一组数据称之为一个数据帧
规定2:数据帧分成两部分=》头+数据
    头包含:源地址与目标地址,该地址是mac地址
    数据包含:包含的是网络层发过来的整体的内容

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

注意:计算机通信基本靠吼,即以太网协议的工作方式是广播

(egon,血嫌弃)(帮我买包子)

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

规定1:一组数据称之为一个数据包
规定2:数据帧分成两部分=》头+数据
    头包含:源地址与目标地址,该地址是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

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


计算机1172.16.10.110101100.00010000.00001010.000000001
255255.255.255.0: 11111111.11111111.11111111.000000000
172.16.10.0:      10101100.00010000.00001010.000000000


计算机2172.16.10.210101100.00010000.00001010.000000010
255.255.255.255.0: 11111111.11111111.11111111.000000000
172.16.10.0:       10101100.00010000.00001010.000000000




计算机1:                            计算机2:

应用层                               应用层
传输层                               传输层
网络层                               网络层
数据链路层                           数据链路层
物理层  <=========二层交互机========> 物理层
                                     0101010101010

(源mac地址,xxxx)(源ip地址,目标ip地址)数据
(源mac地址,网关的mac地址)(172.16.10.10/24101.100.200.11/10)数据


事先知道的是对方的ip地址
但是计算机的底层通信是基于ethernet以太网协议的mac地址通信

ARP:
所以必须能够将ip地址解析成mac地址






# 两台计算机在同一个局域网内
计算机1172.16.10.10/24             直接              计算机2172.16.10.11/24
ARP:
自己的ip,对方的ip
1、计算二者网络地址,如果一样,拿到计算机2的mac地址就可以了
2、发送广播包
发送端mac	FF:FF:FF:FF:FF:FF	172.16.10.10/24	172.16.10.11/24	数据



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

计算机1172.16.10.10/24	              网关           计算机2101.100.200.11/10
ARP:
自己的ip,对方的ip
1、计算机二者网络地址,如果不一样,应该拿到网关的mac地址
2、发送广播包
发送端mac	FF:FF:FF:FF:FF:FF	172.16.10.10/24	172.16.10.1/24	数据


#4.3.1 总结******
ip地址+mac地址=》标识全世界范围内独一无二的一台计算机

或者:
ip地址=》标识全世界范围内独一无二的一台计算机
posted @   喝茶看狗叫  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示