Python3 错误和异常

news/2024/11/8 8:00:24/

Python3 错误和异常

作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。

Python 有两种错误很容易辨认:语法错误和异常。

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

在这里插入图片描述

标准异常如下列表

异常名称描述
Exception所有异常的基类
StopIteration当一个迭代器的 next()方法不指向任何对象时引发
SystemExit由 sys.exit()函数引发
StandardError除了StopIteration异常和SystemExit,所有内置异常的基类
ArithmeticError数值计算所发生的所有错误的基类
OverflowError当数字类型计算超过最高限额引发
FloatingPointError当一个浮点运算失败时触发
ZeroDivisonError当除运算或模零在所有数值类型运算时引发
AssertionError断言语句失败的情况下引发
AttributeError属性引用或赋值失败的情况下引发
EOFError当从 raw_input() 与 input() 函数输入,到达文件末尾时触发
ImportError当一个 import 语句失败时触发
KeyboardInterrupt当用户中断程序执行,通常是通过按 Ctrl+c 引发
LookupError所有查找错误基类
IndexErrorKeyError当在一个序列中没有找到一个索引时引发当指定的键没有在字典中找到引发
NameError当在局部或全局命名空间中找不到的标识引发
UnboundLocalErrorEnvironmentError试图访问在函数或方法的局部变量时引发,但没有值分配给它。Python环境之外发生的所有异常的基类。
IOErrorIOError当一个输入/输出操作失败,如打印语句或 open()函数试图打开不存在的文件时引发操作系统相关的错误时引发
SyntaxErrorIndentationError当在Python语法错误引发;没有正确指定缩进引发。
SystemError当解释器发现一个内部问题,但遇到此错误时,Python解释器不退出引发
SystemExit当Python解释器不使用sys.exit()函数引发。如果代码没有被处理,解释器会退出。当操作或函数在指定数据类型无效时引发
ValueError在内置函数对于数据类型,参数的有效类型时引发,但是参数指定了无效值
RuntimeError当生成的错误不属于任何类别时引发
NotImplementedError当要在继承的类来实现,抽象方法实际上没有实现时引发此异常

在Python中断言

断言是一种理智检查,当程序的测试完成,你可以打开或关闭。
断言的最简单的方法就是把它比作 raise-if 语句 (或者更准确,加 raise-if-not 声明). 一个表达式进行测试,如果结果出现 false,将引发异常。
断言是由 assert 语句,在Python中新的关键字,在Python1.5版本中引入使用的关键字。
程序员常常放置断言来检查输入的有效,或在一个函数调用后检查有效的输出。

assert 语句当它遇到一个断言语句,Python评估计算之后的表达式,希望是 true 值。如果表达式为 false,Python 触发 AssertionError 异常。

断言的语法是 -

assert Expression[, Arguments] 

如果断言失败,Python使用 ArgumentExpression 作为AssertionError异常的参数。AssertionError异常可以被捕获,并用 try-except语句处理类似其他异常,但是,如果没有处理它们将终止该程序并产生一个回溯。

示例这里是一个把从开氏度到华氏度的温度转换函数。

#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):assert (Temperature >= 0),"Colder than absolute zero!"return ((Temperature-273)*1.8)+32print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

当执行上面的代码,它产生以下结果 -

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in 
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

except子句中无异常

也可以使用 except 语句定义如下无异常声明如下 -

try:You do your operations here......................
except:If there is any exception, then execute this block.......................
else:If there is no exception then execute this block. 

except子句与多个异常

也可以使用相同的 except 语句来处理多个异常,具体如下 -

try:You do your operations here......................
except(Exception1[, Exception2[,...ExceptionN]]]):If there is any exception from the given exception list, then execute this block.......................
else:If there is no exception then execute this block. 

try/except…else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

在这里插入图片描述
以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:

for arg in sys.argv[1:]:try:f = open(arg, 'r')except IOError:print('cannot open', arg)else:print(arg, 'has', len(f.readlines()), 'lines')f.close()

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。例如:

>>> def this_fails():x = 1/0>>> try:this_fails()except ZeroDivisionError as err:print('Handling run-time error:', err)Handling run-time error: int division or modulo by zero

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

在这里插入图片描述

以下实例中 finally 语句无论异常是否发生都会执行:

try:runoob()
except AssertionError as error:print(error)
else:try:with open('file.log') as file:read_data = file.read()except FileNotFoundError as fnf_error:print(fnf_error)
finally:print('这句话,无论异常是否发生都会执行。')

http://www.ppmy.cn/news/25683.html

相关文章

Windows环境下使用Pycharm运行sh文件

博主在调试一些程序时,时常遇到 .sh文件,这是Linux中的shell脚本文件,那么这种文件在windows下如何运行呢,其实我们可以通过git来实现,接下来看我操作。 首先我们需要安装Git,关于其安装过程可以参考博主这…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

前端面试题

前言 记录自己2023年面试中遇到的回答的不是很好的题目。 题目 一、微信小程序上传包不能大于2m,怎么处理 1、压缩静态资源,图片类可以上传服务器 2、分包 将非tabBar页面的页面从主包中分离出去 "pages":["pages/index/index","page…

Docker安全防护与配置

author: aming email: jikcheng163.com title: Docker安全防护与配置 creation_date: 2023-02-08 12:26 Last modified date: 2023-02-08 14:09 tags: Docker安全防护与配置 File Folder with relative path: reading notes/doc remark: other: 本章背景知识 运行在容器内部的…

23美赛D题:确定联合国可持续发展目标的优先级(ICM)思路Python代码

问题D(交叉网络建模题):确定联合国可持续发展目标的优先级(ICM) 赛题目的:对联合国制定的17个可持续发展目标进行关系网络的构建同时评估其可能存在的影响赛题解读&解题思路链接:交叉网络回归路径分析,如何寻找到能代表可持续发展目标的数值是这道题的难点。背景 联…

金融帝国实验室(Capitalism Lab)《官方中文社群抽奖规则》(修订)

★修 订 说 明★ 为进一步完善社群决策制定程序,提高抽奖活动公平化、丰富化水平,切实提升抽奖活动质量,现对《官方中文社群抽奖规则》进行修订(第四次)。 ————————————— ◎〖本次修订内容〗&#xf…

JMeter 做接口性能测试,YYDS

简介 本文由xmeter君写给想了解性能测试和JMeter的小白,适合对这两者了解很少的同学们,如果已经有使用经验的请绕道,别浪费时间:-) 我们将介绍JMeter的使用场景,如何安装、运行JMeter,以及开始一个最最简单的测试。 …

Retrofit源码分析实践(八)【Retrofit CallAdapter的引入】

Retrofit源码分析&实践系列文章目录 Retrofit源码分析&实践(一)【从使用入手分析源码】Retrofit源码分析&实践(二)【Retrofit 免费的api测试工具引入】Retrofit源码分析&实践(三)【Retrofit 代码框架搭建】Retrofit源码分析&实践(四)【Retrofit 实…