Python学习笔记(十三)——编译错误和异常处理

news2024/11/18 14:23:45

异常和异常类

Python常见错误

语法错误

源代码存在拼写语法错 误,这些错误导致Python 编译器无法把Python源代 码转换为字节码,故也称 之为编译错误。
>>> print("我爱山大"}
SyntaxError: invalid syntax

运行时错误

• 程序中没有导入相关的模块:NameError
程序中包括零除运算
打开不存在的文件:
FileNotFoundError
>>> 1/0
ZeroDivisionError: division by zero

逻辑错误

程序可以执行(程序运 行本身不报错),但执行 结果不正确。Python解释 器对此无能为力,需要根据结果来调试判断。
>>> from math import sqrt
>>> a=1;b=2;c=3
>>> x1=-b+sqrt(b**2-4*a*c)/2*a
math domain error

异常处理

简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多,例如除零、 下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、 磁盘空 间不足,等等。
代码运行时如果发生了异常,将生成代表该异常的一个对象,并交由 Python 解释器寻找相应的代码来处理这一异常。合理地使用异常处理结果可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止。

异常类

所有异常都是基类 BaseException 的派生类,它们都定义在 BaseExceptions 块中。
如果这个异常对象没有进行处理和捕捉,程序就会用所谓的回溯( traceback ,一 种错误信息)终止执行, 这些信息包括错误的名称(例如 NameError )、原因和 错误发生的行号。

异常类的层次结构 

(1)NameError。尝试访问一个未申明的变量。
>>> noname #报错。NameError: name 'noname' is not defined
(2)SyntaxError。语法错误。
>>> int a #报错。SyntaxError: invalid syntax
(3)AttributeError。访问未知对象属性。
>>> a=1
>>> a.show() #报错。AttributeError: 'int' object has no attribute 'show'
(4)TypeError。类型错误。
>>> 11 + 'abc' #报错。TypeError: unsupported operand type(s) for +: 'int' and 'str'
(5)ValueError。数值错误。
>>> int('abc') #报错。ValueError: invalid literal for int() with base 10: 'abc’ (6)ZeroDivisionError。零除错误。
>>> 1/0 #报错。ZeroDivisionError: division by zero
(7)IndexError。索引超出范围。
>>> a=[10,11,12]
>>> a[3] #报错。IndexError: list index out of range
(8)KeyError。字典关键字不存在。
>>> m = {'1':'yes', '2':'no'}
>>> m['3'] #报错。KeyError: '3'

常见的异常类

异常名称
描述
ZeroDivisionError
( 或取模 ) ( 所有数据类型 )
NameError
未声明 / 初始化对象 ( 没有属性 )
SyntaxError
解释器发现语法错误
IndexError
序列中不存在的索引
KeyError
使用映射中不存在的键
FileNotFoundError
试图打开不存在的文件
AttributeError
尝试访问未知对象属性
IndentationError
缩进错误
TabError
Tab 和空格混用
ImportError
导入模块 / 对象失败
IOError
输入 / 输出操作失败
AssertionError
断言语句失败

 抛出异常类

大部分由程序错误而产生的错误和异常,一般由 Python 虚拟机自动抛出。
如果判断某种错误情况,则可以创建相应的异常类的对象,并通过 raise 语句抛出
Python 虚拟机出现错误时会自动抛出异常
>>> 1/0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module> 1/0
ZeroDivisionError: division by zero
使用 raise 语句主动抛出异常 .
>>> if a<0:raise ValueError("数值不能为负数")

#Traceback (most recent call last):
#File "<pyshell#6>", line 1, in <module>
#if a<0:raise ValueError("数值不能为负数")
#ValueError: 数值不能为负数

主动抛出异常类

raise 语句主动抛出一个异常,异常 / 错误对象必须有一个名字,且它们是 Error Exception 类的子类。
raise [exceptionName [(reason)]]
exceptionName 指定异常的名字,是 Error Exception 类的子类。
reason 对异常的描述。

#实例
>>> if a<0: raise ValueError("数值不能为负数")

使用类名引发异常

raise 语句指定异常的类名时, 会创建该类的实例对象,然后引发异常。

 raise IndexError

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise IndexError
IndexError

 通过显示地创建异常类的对象, 直接使用对象来引发异常。

index = IndexError()
raise index
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
raise index
IndexError

指定异常的描述信息

当使用 raise 语句抛出异常时,可以给异常类指定描述信息。
raise IndexError("索引下标超出范围")
Traceback (most recent call last):
File "D:/异常.py", line 1, in <module>
raise IndexError("索引下标超出范围")
IndexError: 索引下标超出范围

 异常处理

Python 语言采用结构化的异常处理机制。
通过 try 语句来定义代码块,以运行可能抛出异常的代码;
通过 except 语句,可以捕获特定的异常并执行相应的处理;
通过 finally 语句,即保证处理异常,也可在事后清理资源等。
tip: 在try中出现错误代码(报错),不需要管,他会根据报错类型,执行对应的except中的代码块。
finally语句则会用来做收尾工作(可有可无)

常用的异常处理

  • 简单异常: try语句+except异常名
  • 多个异常: try语句+多个excep异常名
  • 所有异常:try语句 +except
  • 没有异常: try语句+ except+ else
  • 终止行为: try语句+except+finally语句

捕获所有异常情况的方法

当程序中出现大量异常时,捕获这些异常是非常麻烦的。这时,我们可以在 except 子句中不指明异常的类型,这样,不管发生何种类型的异常,都会 执行 except 里面的处理代码。(可以少列很多限制条件)
try:
    num1 = input('请输入第1个数:')
    num2 = input('请输入第2个数:')
    print(int(num1)/int(num2))
# 放在所有except语句最后
except Exception as result:
    print('捕获到异常:%s'%result)

未捕获异常 

如果 try 语句没有捕获到任何的错误信息,就不再执行任何 except 语句,而 是会执行 else 语句。
try:
    num1 = input("请输入第1个数:")
    num2 = input("请输入第2个数:")
    print(int(num1)/int(num2))
except Exception as result:
    print("捕捉到异常:%s"%result)
else:
    print("程序正常运行,没有捕捉到异常")

 中止行为

在程序中,无论是否捕捉到异常, 都必须要执行某件事情,例如关 闭文件、释放锁等,这时可以提 finally 语句处理。通常情况下, finally 用于释放资源
tip:是否异常均执行。
import time
try:
    f = open('test.txt',"w+")
    while True:
        content = f.read()
        if len(content) == 0:
          break
    time.sleep(2)
    print(content)
finally:
    f.close()
    print('关闭文件')

try-except语句小结

自定义异常

应用场景

前面捕捉的异常都是系统内置的,在某些错误时自动触发。然而程序员有时需要根据自己的需求设定异常。例如,用户注册账户是需要限定用户名、密码等信息的类型和字数。

创建用户自定义异常需要完成如下的工作

创建一个继承Exception类的子类,就是自定义异常类。

当遇到自己设定的错误时,使用raise语句抛出自定义的异常。

实例

class ShortInputException(Exception):
    def __init__(self, length, atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast
try:
    s = input('请输入 --> ')
    if len(s) < 3:
        raise ShortInputException(len(s), 3)
except EOFError:
    print ('你输入了一个结束标记EOF')
except ShortInputException as x:
    print ('ShortInputException: 长度是 %d, 至少应是 %d' % (x.length, x.atleast))
else:
    print ('没有异常发生.')

 Python官方讲解exception类

断言处理

在程序调试阶段往往需要判断代码执行过程中变量的值或类型等关键信息。 断言相比 print 语句更加灵活和高效,其一般应用于下列情况。
前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性
断言的主要功能是帮助程序员调试程序,以保证程序运行的正确性;断言一般 在开发调试阶段使用。即调试模式时断言有效,优化模式运行时,自动忽略 断言。

assert语句

assert 语句又称作断言,指的是 期望用户满足指定的条件
当用户定义的约束条件不满足时,会出发 AssertionError 异常,所以 assert 句可以当做条件式的 raise 语句。
assert 布尔表达式 ,<描述性字符>
                        ||
                        V
if not 布尔表达式:
        raise AssertionError(<描述性字符串>)
assert 后面紧跟一个布尔表达式,相当于条件。描述性字符串是当条件为 false 时作
为异常的描述信息。
>>> a = 0
>>> assert a!=0,"a的值不能为0"
Traceback (most recent call last):
File "D:/异常.py", line 2, in <module> assert a!=0,"a的值不能为0"
AssertionError: a的值不能为0

实例

 

 程序基本调试方法

在程序实际运行之前,查找和修正其错误的过程称为调试 (debugging)

语法错误的调试

对于编辑错误, Python 解释器会直接剖出异常,用户可以根据异常信息修改 程序的代码。
>>> if 1>2
SyntaxError: invalid syntax
>>> x
NameError: name 'x' is not defined

运行时错误的调试

对于运行时错误, Python 解释器也会抛出异常,在代码中可以通过 try…except 语 句捕获并处理。如果程序中没有 try…except ,则 Python 解释 器直接打印出异常信息。
>>> f=open("123.txt")
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
>>> 123+"abc"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

逻辑错误处理的常用方法

包括断点跟踪、输出信息等方法
有的集成开发环境( IDE )可以设置断点,并查看变量等
通过 print 语句输出程序运行过程中变量值(跟踪信息),是观察和调试程序运行逻辑正确性的有效方法

 单条语句调试

函数调试 

 

传送门:Python全套学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python常用库1:collections,容器数据类型

collections&#xff1a;数据容器 点这里跳到原文地址。预计阅读时长&#xff1a;10分钟未完待续&#xff0c;遇到相关力扣题目&#xff0c;会继续补充~ 文章目录前言一、Collections中的内置函数二、各个函数的使用1. deque1.1 deque的介绍1.2 deque支持的方法1.3 使用deque解…

js-键盘事件

onkeydown:按键被按下 onkeyup:按键被松开 事件绑定的对象&#xff1a;键盘事件一般绑定给可以获取焦点的对象或者document对象 焦点&#xff1a;光标在闪的&#xff1a;比如input标签 如果一直按按键不松手&#xff0c;按键会一直被触发 当&#xff1a;onkeydown连续触发时…

THREE.JS实现看房自由(VR看房)

VR看房一、前言二、基础知识三、场景3.1 网络模型3.2 光照3.2.1 环境光3.2.2 平行光3.2.3 点光源3.2.4 聚光灯3.2.5 半球光四、相机4.1 正交相机4.2 透视相机五、渲染器六、贴图纹理6.1 基础介绍6.2 环境贴图6.3 HDR处理七、拓展7.1 坐标系7.2 控制器7.3 自适应7.4 全屏响应7.5…

C#基础·补丁

文章目录一 命名空间二字符串2.1 System.String类2.2 StringBuilder类三 正则表达式3.1 什么是正则表达式&#xff1f;3.2 查找举例3.3 重复描述字符举例3.4 反义字符3.5 基本语法元字符3.6 定位元字符3.7 择一匹配3.8 分组一 命名空间 二字符串 字符串类 System.String(strin…

python数据分析之numpy

数据分析之Numpy 1、Numpy的数组对象及其索引 import numpy as npimport numpy as npanp.array([1,2,3,4]) print(a) bnp.array([2,3,4,5]) print(b)print(ab)产生数组 从列表产生数组&#xff1a; list_array[1,2,3,4] anp.array(list_array) print(a)从列表传入&#xff…

PCB设计很简单?生产问题才是考验工程师能力的标准!

BOM清单有误 SMT产线&#xff1a;物料封装怎么和PCB焊盘不一致呢&#xff1f;停线排查。 仓库&#xff1a;我是按照BOM清单发的物料。 硬件研发&#xff1a;哎&#xff0c;BOM整理时马虎了。 过孔焊盘问题 “ 连锡问题 产线维修&#xff1a;怎么这么多连锡导致不良的产品&…

【安信可NB-IoT模组EC系列应用笔记⑧】用NB-IoT模组EC系列了解LwM2M协议并接入云平台

文章目录前言一、测试准备1、硬件准备2、云平台准备二、云平台连接1.注册入网2.读取IMSI及IMEI3.利用IMSI及IMEI创建设备4.LwM2M连接云平台设备三、 数据互交1.ATMIPLNOTIFY 通知属性变化2.ATMIPLREADRSP 返回读取结果3.ATMIPLWRITERSP 发送写入结果4.ATMIPLEXECUTERSP 发送执行…

1.uniapp全局状态管理

概念&#xff1a;把多个组件之间共享数据抽离出来&#xff0c;通过一个“单例模式”进行管理 工具&#xff1a;具备全局状态管理的库 Vuex:全局状态管理中的库 步骤&#xff1a; 1.建立Store文件夹 2.建立index.js文件 3.在main.js中注册Vue插件 4.测试Vuex是否导入成功 …

面试面麻了,别再为难软件测试人员了···

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

基于单片机的双足仿生运动机器人的设计

目录 1 概述 1 1.1 研究背景及意义 1 1.2 机器人的应用领域及发展现状 1 1.2.1 应用领域 1 1.2.2 发展现状 1 1.3 双足机器人设计要求 2 1.3.1 硬件部分 2 1.3.2 软件部分 2 2 系统方案设计 3 2.1 主控芯片选择 3 2.2 机器人自由度选择 3 2.3 驱动方案选择 3 2.4 双足机器人的步…

00后表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

web安全之信息收集

&#x1f4aa;&#x1f4aa; web安全之信息收集1.网络入口/信息1.1网络拓扑信息1.2 IP信息1.3线下网络2.域名信息2.1Whios2.2搜索引擎搜索2.3. 第三方查询2.4. ASN信息关联2.5. 域名相关性2.6. 网站信息利用2.7. HTTPS证书2.8. CDN2.9. 子域爆破3.端口信息3.1常见端口3.2端口扫…

具有现代设计和最新Bootstrap版本的数字市场HTML模板

DegMark是具有现代设计和最新Bootstrap版本的数字市场HTML模板。凭借优秀的设计很容易创建虚拟商品交易网站&#xff0c;比如图片素材在线交易&#xff0c;视频文件交易&#xff0c;代码交易等虚拟商品交易。 主要特色 Bootstrapv5 移动响应 FontAwesome图标 jQuery增强 …

metaRTC Visual Studio编译指南

概述 metaRTC windows版本提供qt和vs2019两种编译支持&#xff0c;vs2019编译工程支持从metaRTC6.0版本开始&#xff0c;qt编译在B站有视频教程。 metaRTC5 windows版编译教程_哔哩哔哩_bilibilimetartc5编译教程&#xff0c;windows版本只支持msvc,下载所带第三方库为msvc20…

生物信息-快速序列比对-edlib包安装与使用方法-python和dll

安装 下载&#xff1a;https://github.com/Martinsos/edlib cd build && cmake -D CMAKE_BUILD_TYPERelease .. && make升级cmake https://cmake.org/download/ 下载tar.gz包&#xff0c;我这里下载的是&#xff1a; 拷贝到 /home/xxx/app 下解压&#xff…

初识C#事件

文章目录一 事件1 抛砖引玉案例1.1工具人下楼案例1.1.1 ToolMan.cs1.1.2 LazyMan.cs1.1.3 Program.cs1.1.4 测试结果1.1.5 升级到事件二 委托和事件的区别和联系一 事件 1 抛砖引玉案例 订阅和发布机制 比如说&#xff0c;我要下楼去吃饭&#xff0c;正常情况下我会问一下室友…

设计模式之适配器模式

设计模式之适配器模式 文章目录设计模式之适配器模式1. 定义2. 类型3. 场景4. 优点5. 缺点6. 适配器扩展6. 相关适配器模式7. coding7.1 被 适配者方法7.2 接口7.3 接口的实现7.4 适配者适配被适配者达到Target 目标7.5 类适配器的实现方式&#xff0c;其他的都不变8. 源码解析…

【Django】REST_Framework框架——序列化器serializers源码解析

一、序列化器类——Serializer 1、序列化器的作用 序列化器的使用分两个阶段&#xff1a; 1、在客户端请求时&#xff0c;使用序列化器可以完成对数据的反序列化&#xff08;将字典格式的数据转化为模型对象&#xff09;。 2、在服务器响应时&#xff0c;使用序列化器可以完…

网络原理——No.4 传输层_TCP协议中的延迟应答, 捎带应答, 面向字节流与TCP的异常处理

JavaEE传送门JavaEE 网络原理——No.2 传输层_TCP的连接管理 网络原理——No.3 传输层_TCP的滑动窗口, 流量控制与拥塞控制 目录延迟应答捎带应答面向字节流粘包问题TCP 中的异常处理(连接异常)TCP 和 UDP 的应用场景延迟应答 一种提高传输效率的机制, 又是基于流量控制, 来引…

Appinventor——蓝牙app(蓝牙遥控器、串口助手、温湿度显示、切换界面蓝牙依旧保持连接)

App Inventor由谷歌实验室开发&#xff0c;移交麻省理工学院&#xff0c;是一款图形化编程环境&#xff0c;不需要复杂的变成语言&#xff0c;采用搭积木的方式编程&#xff0c;只需将组件拖入即可&#xff0c;简直就是不爱编程党的超级福音 本文搭建了一个蓝牙app&#xff0c…