异常

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 计算机1:
172.16.10.1: 10101100.00010000.00001010.000000001
255255.255.255.0: 11111111.11111111.11111111.000000000
172.16.10.0: 10101100.00010000.00001010.000000000 计算机2:
172.16.10.2: 10101100.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/24,101.100.200.11/10)数据 事先知道的是对方的ip地址
但是计算机的底层通信是基于ethernet以太网协议的mac地址通信 ARP:
所以必须能够将ip地址解析成mac地址 # 两台计算机在同一个局域网内
计算机1:172.16.10.10/24 直接 计算机2:172.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 数据 # 两台计算机不在同一个局域网内 计算机1:172.16.10.10/24 网关 计算机2:101.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地址=》标识全世界范围内独一无二的一台计算机

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

  1. 第八篇:python基础_8 面向对象与网络编程

    本篇内容 接口与归一化设计 多态与多态性 封装 面向对象高级 异常处理 网络编程 一. 接口与归一化设计 1.定义 (1)归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了 ...

  2. [Python_4] Python 面向对象(OOP)

    0. 说明 Python 面向对象(OOP) 笔记.迭代磁盘文件.析构函数.内置方法.多重继承.异常处理 参考 Python面向对象 1. 面向对象 # -*-coding:utf-8-*- &quo ...

  3. Python面向对象之异常

    异常的概念 程序在运行时,如果python解释器遇见一个错误,就会停止程序的运行,并且提示一些错误信息,这就是异常: 程序遇见错误停止执行并且提示错误信息,这个动作我们称之为抛出(raise)异常: ...

  4. Python面向对象之异常捕获(一)-----抛出一个异常

    大部分的异常都继承自Exception这个类(而这个类有继承自BaseException这个类) 常见的异常 ValueError TypeError IndexError 抛出一个异常 下面这个类的 ...

  5. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  6. python 面向对象的程序设计

    一:什么是编程范式? 编程是程序员用特定的语法 + 数据结构 + 算法组成的代码来告诉计算机如何执行任务的过程. 如果把编程的过程比喻为练习武功,那么编程范式指的就是武林中的各种流派,而在编程的世界里 ...

  7. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  8. #4 Python面向对象(三)

    前言 前两节讲解了Python面向对象的思想和Python类中各种变量的含义以及区别.肯定有小伙伴会问,类初始化时是否可以传入参数?如果有多个类中含有共同的函数方法,是否可以重复利用?本节就带着这些问 ...

  9. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  10. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

随机推荐

  1. Linux系统运维之zabbix配置tomcat监控

    一.介绍 半年前安装的zabbix监控,当时配合异地的测试人员给A项目做压力测试,主要监控项目部署的几台服务器的内存.CPU信息,以及后来网络I/O等,也没考虑JVM:最近闲下来,想完善下监控,故留此 ...

  2. 据说,Transformer 不能有效地进行时间序列预测?

    简介 几个月前,我们介绍了 Informer 这个模型,相关论文 (Zhou, Haoyi, et al., 2021) 是一篇获得了 AAAI 2021 最佳论文奖的时间序列论文.我们也展示了一个使 ...

  3. 【环境搭建】多版本的jdk共存

    问题来源 burpsuite 2021需要使用Java 9及以上版本,而其他工具需要Java 8,因此需要两个版本共存,并且做到除了burpsuite以外的工具默认使用Java 8打开. 需要的软件 ...

  4. 2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?

    2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用? 答案2023-07-16: 什么是零拷贝? 零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先 ...

  5. 【RabbitMQ】当队列中消息数量超过最大长度的淘汰策略

    [RabbitMQ]当队列中消息数量超过最大长度的淘汰策略 说明 最近在研究RabbitMQ如何实现延时队列时发现消息进入死信队列的情况之一就是当消息数量超过队列设置的最大长度时会被丢入死信队列,看到 ...

  6. 我真的想知道,AI框架跟计算图什么关系?PyTorch如何表达计算图?

    目前主流的深度学习框架都选择使用计算图来抽象神经网络计算表达,通过通用的数据结构(张量)来理解.表达和执行神经网络模型,通过计算图可以把 AI 系统化的问题形象地表示出来. 本节将会以AI概念落地的时 ...

  7. nmcli 命令简单使用

    centos7/8 机器上默认有安装nmcli,可直接使用修改ip. nmcli c add type ethernet ifname eth0 # 会提示 'ethernet-eth0' 创建成功 ...

  8. 策略模式+Spring配置类优化多if..else思路

    图示 1. 现状 场景: 假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理.如果我们通过if..else的方式处理的话会显得比较冗余. 例如: if("alarmEvent&q ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (71)-- 算法导论7.1 1题

    参照图 7-1的方法,说明 PARTITION在数组 A=(13,19,9,5,12,8,7,4,21,2,6,11)上的操作过程. 文心一言: PARTITION 是一种常见的快速排序算法,其目的是 ...

  10. 记通过mysql数据库成功入侵到服务器内部的渗透实战

    1,在成功进入mysql到数据库之后,可以使用select user();命令,查看当前的用户,如果为root,则可以执行下一步操作.不为root,则需要通过其他方法提权. 2, 使用show var ...