异常

1、什么是异常

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

  1. >>> if
  2. File "<stdin>", line 1
  3. if
  4. ^
  5. SyntaxError: invalid syntax

另一类就是逻辑错误,常见的逻辑错误如

  1. # TypeError:数字类型无法与字符串类型相加
  2. 1+’2
  3. # ValueError:当字符串包含有非数字的值时,无法转成int类型
  4. num=input(">>: ") #输入hello
  5. int(num)
  6. # NameError:引用了一个不存在的名字x
  7. x
  8. # IndexError:索引超出列表的限制
  9. l=['egon','aa']
  10. l[3]
  11. # KeyError:引用了一个不存在的key
  12. dic={'name':'egon'}
  13. dic['age']
  14. # AttributeError:引用的属性不存在
  15. class Foo:
  16. pass
  17. Foo.x
  18. # ZeroDivisionError:除数不能为0
  19. 1/0

2、为何处理异常

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

3、如何处理异常?

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

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

3.2 逻辑上的错误

  1. print(x)
  2. l = ['a', 'b']
  3. l[2]
  4. 1/0
  5. int('abc')
  6. dic = {'name': 'egon'}
  7. dic['age']
  8. class Foo:
  9. pass
  10. Foo.x

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

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

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

  1. try:
  2. 被检测的代码块
  3. except (NameError,IndexError,TypeError):
  4. 触发NameErrorIndexErrorTypeError时对应的处理逻辑
  5. 举例
  6. def convert_int(obj):
  7. try:
  8. res=int(obj)
  9. except (ValueError,TypeError):
  10. print('argument must be number or numeric string')
  11. res=None
  12. return res
  13. convert_int('egon') # argument must be number or numeric string
  14. convert_int({'n':1}) # argument must be number or numeric string

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

  1. try:
  2. 被检测的代码块
  3. except NameError:
  4. 触发NameError时对应的处理逻辑
  5. except IndexError:
  6. 触发IndexError时对应的处理逻辑
  7. except Exception:
  8. 其他类型的异常统一用此处的逻辑处理

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

  1. class PoolEmptyError(Exception): # 可以通过继承Exception来定义一个全新的异常
  2. def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法
  3. super(PoolEmptyError,self).__init__()
  4. self.value=value
  5. def __str__(self): # 可以定义该方法用来定制触发异常时打印异常值的格式
  6. return '< %s >' %self.value
  7. class NetworkIOError(IOError): # 也可以在特定异常的基础上扩展一个相关的异常
  8. pass
  9. raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted >
  10. raise NetworkIOError('连接被拒绝') # __main__.NetworkIOError: 连接被拒绝

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

  1. age='18'
  2. # 若表达式isinstance(age,int)返回值为False则触发异常AssertionError
  3. assert isinstance(age,int)
  4. # 等同于
  5. if not isinstance(age,int):
  6. raise AssertionError

4、何时使用异常处理

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

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

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

  1. import requests
  2. from requests.exceptions import ConnectTimeout # 导入requests模块内自定义的异常
  3. def get(url):
  4. try:
  5. response=requests.get(url,timeout=3)#超过3秒未下载成功则触发ConnectTimeout异常
  6. res=response.text
  7. except ConnectTimeout:
  8. print('连接请求超时')
  9. res=None
  10. except Exception:
  11. print('网络出现其他异常')
  12. res=None
  13. return res
  14. get('https://www.python.org')

网络编程的一些预备知识

  1. # 1、CS架构与BS架构
  2. Client<===========>Server
  3. 客户端软件send 服务端软件recv
  4. 操作系统 操作系统
  5. 计算机硬件<====物理介质=====>计算机硬件
  6. Browser<===========>Server
  7. # 2、网络通信
  8. 网络存在的意义就是跨地域数据传输=》称之为通信
  9. 网络=物理链接介质+互联网通信协议
  10. # 3、OSI七层协议
  11. 五层协议
  12. 应用层
  13. 传输层
  14. 网络层
  15. 数据链路层
  16. 物理层
  17. 协议:规定数据的组织格式
  18. 格式:头部+数据部分
  19. 封包裹的过程:数据外加头
  20. 拆包裹的过程:拆掉头获取数据
  21. #4、五层协议
  22. 计算机1 计算机2
  23. 应用层 应用层
  24. 传输层 传输层
  25. 网络层 网络层
  26. 数据链路层 数据链路层
  27. 物理层 <===========交互机===========> 物理层
  28. 0101010101010
  29. (源mac地址,目标mac地址)(源ip地址,目标ip地址)数据
  30. #4.1 物理层负责发送电信号
  31. 一组物理层数据称之为:位
  32. 单纯的电信号毫无意义,必须对其进行分组
  33. #4.2 数据链路层:ethernet以太网协议
  34. 规定1:一组数据称之为一个数据帧
  35. 规定2:数据帧分成两部分=》头+数据
  36. 头包含:源地址与目标地址,该地址是mac地址
  37. 数据包含:包含的是网络层发过来的整体的内容
  38. 规定3:规定但凡接入互联网的主机必须有一块网卡,每块网卡在出厂时都烧制好一个全世界独一无二的地址,该地址称之为mac地址
  39. 注意:计算机通信基本靠吼,即以太网协议的工作方式是广播
  40. egon,血嫌弃)(帮我买包子)
  41. #4.3 网络层:IP协议
  42. 要达到的目的:
  43. 划分广播域
  44. 每一个广播域但凡要接通外部,一定要有一个网关帮内部的计算机转发包到公网
  45. 网关与外界通信走的是路由协议
  46. 规定1:一组数据称之为一个数据包
  47. 规定2:数据帧分成两部分=》头+数据
  48. 头包含:源地址与目标地址,该地址是IP地址
  49. 数据包含的:传输层发过来的整体的内容
  50. ipv4地址:
  51. 8bit.8bit.8bit.8bit
  52. 0.0.0.0
  53. 255.255.255.255
  54. 子网掩码:
  55. 8bit.8bit.8bit.8bit
  56. 255.255.255.0对应的二进制表达
  57. 11111111.11111111.11111111.00000000
  58. 一个合法的ipv4地址组成部分=ip地址/子网掩码地址
  59. 172.16.10.1/255.255.255.0
  60. 172.16.10.1/24
  61. 计算机1
  62. 172.16.10.1 10101100.00010000.00001010.000000001
  63. 255255.255.255.0: 11111111.11111111.11111111.000000000
  64. 172.16.10.0: 10101100.00010000.00001010.000000000
  65. 计算机2
  66. 172.16.10.2 10101100.00010000.00001010.000000010
  67. 255.255.255.255.0: 11111111.11111111.11111111.000000000
  68. 172.16.10.0: 10101100.00010000.00001010.000000000
  69. 计算机1 计算机2
  70. 应用层 应用层
  71. 传输层 传输层
  72. 网络层 网络层
  73. 数据链路层 数据链路层
  74. 物理层 <=========二层交互机========> 物理层
  75. 0101010101010
  76. (源mac地址,xxxx)(源ip地址,目标ip地址)数据
  77. (源mac地址,网关的mac地址)(172.16.10.10/24101.100.200.11/10)数据
  78. 事先知道的是对方的ip地址
  79. 但是计算机的底层通信是基于ethernet以太网协议的mac地址通信
  80. ARP
  81. 所以必须能够将ip地址解析成mac地址
  82. # 两台计算机在同一个局域网内
  83. 计算机1172.16.10.10/24 直接 计算机2172.16.10.11/24
  84. ARP
  85. 自己的ip,对方的ip
  86. 1、计算二者网络地址,如果一样,拿到计算机2mac地址就可以了
  87. 2、发送广播包
  88. 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据
  89. # 两台计算机不在同一个局域网内
  90. 计算机1172.16.10.10/24 网关 计算机2101.100.200.11/10
  91. ARP
  92. 自己的ip,对方的ip
  93. 1、计算机二者网络地址,如果不一样,应该拿到网关的mac地址
  94. 2、发送广播包
  95. 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.1/24 数据
  96. #4.3.1 总结******
  97. ip地址+mac地址=》标识全世界范围内独一无二的一台计算机
  98. 或者:
  99. 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. Docusaurus之markdown文档的vscode代码片段

    需求 我是使用Docusaurus建立的个人站点,在写文档是总是要在开头配置作者.日期等等,用过Docusaurus的都应该知道. 因为每次新建一个md文档都需要重新配置,很麻烦,于是我就想能不能新建 ...

  2. Linux系统基础知识与自学方法

    Linux系统基础知识与自学方法 大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统.关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒.弹窗)多多,总之 ...

  3. 【有奖调研】HarmonyOS新物种,鸿蒙流量新阵地——元服务邀你来答题!

    "聊技术无话不谈,一起来吹吹元服务!畅聊你对元服务的想法,说不定,你就能撬动元服务的爆发增长!" 元服务(即原子化服务)是华为"轻量化"服务的新物种,可提供全新 ...

  4. 【QCustomPlot】使用方法(动态库方式)

    说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记.同系列文章目录可见 <绘图库 QCustomPlot 学习笔记>目录.本篇介绍 QCustomPlot 的一种使用方法, ...

  5. .NET Core 允许跨域的两种方式实现(IIS 配置、C# 代码实现)

    〇.前言 当把开发好的 WebApi 接口,部署到 Windows 服务器 IIS 后,postman 可以直接访问到接口并正确返回,这并不意味着任务完成,毕竟接口嘛是要有交互的,最常见的问题莫过于跨 ...

  6. Web网页音视频通话之基于sipjs功能扩展

    在上一篇开发基础上,已经实现了音视频通话.本文是在此基础上继续完成以下内容 关闭/开启音频 开启/关闭视频 屏幕共享 开启/关闭音频 javaScript /** * 静音 */ mute() { i ...

  7. Map集合_HashMap_TreeMap_等_小记

    Map是一种依照键值对数据存储元素的容器. Map中的元素是两个对象,一个对象作为键,一个对象作为值.一个键(key)和它对应的值构成map集合中的一个元素.Map集合的数据结构只跟键有关,键不可以重 ...

  8. HTTP&HTTPS协议

    HTTP协议 1.什么是HTTP 超文本传输协议( HyperText Transfer Protoco,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议. HTTP(HyperT ...

  9. UE4构建基础和实践:一、概述

    序言 构建这个概念是和应用程序包及资源等相关的,它的特点是使用脚本控制一系列的任务的处理,以减少人力操作带来的成本和操作失误风险. 在UE的概念里,构建往往是和打包相关的(如编译.cook.压缩打包等 ...

  10. Llama 2 来袭 - 在 Hugging Face 上玩转它

    引言 今天,Meta 发布了 Llama 2,其包含了一系列最先进的开放大语言模型,我们很高兴能够将其全面集成入 Hugging Face,并全力支持其发布. Llama 2 的社区许可证相当宽松,且 ...