关于 python 的异常使用说明 (python 的文件和异常)

异常

pyhong 使用被异常成为异常的特殊对象来管理程序执行期间发生的错误。
每当发生让 python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 tracback,其中包含有关异常的报告。
异常是使用 try-except 代码块处理的。它让python执行指定的操作,同时告诉python发生异常时该怎么办。使用它,即便出现异常,程序也将继续运行:显示你编写的友好错误信息,而不是令用户迷惑的 tracback

1. 处理异常 ZeroDivisionError 异常

我们先来看一下导致python异常的简单错误:
你可能知道不能将一个数字除以0,但我们让python这样做呢?

print(5/0)

在这里插入图片描述
python 解释器在运行中已经告诉我们错误问题了,
它说 除数为零的一种错误,而 ZeroDivisionError 这个异常对象,就是python无法按照你的要求正常执行时创建的。

为解决这个问题,我们可以使用:

2. 使用 try-except 代码块

当你认为可能会发生错误时,就可以编写这个代码块来处理可能引发的异常。

try:
	print(5/0)
except ZeroDivisionError:
	print('零不可以作为除数哦!')

在这段代码当中,
我们将导致错误的 代码放在了 try代码块中。如果try处的代码块运行时不会出现异常,python也将不会执行 except 代码块。反之,python 将查找 except 代码块,并执行其中的代码。

我们来看一下执行结果:
在这里插入图片描述

3. 使用异常避免崩溃

在发生错误时,如果程序还有工作没有执行完成,妥善地处理错误尤为重要。这种情况常会发生在要求用户提供输入的程序当中;如果能够妥善处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。

我们来编写一个简单的计算器:

print('- - - 欢迎使用- 计算器 - - - ')
print('使用请按:'+'e'+',退出请按:'+'q')

while True:
	uInfo = input('请您开始录入:')
	if uInfo == 'q':
		break
	if uInfo =='e':
		number1 = input('请您录入被除数:')
		number2 = input('请您继续录入除数:')
		
		print('计算器正在为您计算结果....')
		print(int(number1)/int(number2))

我们只是编写一个简易的计算器,用于说明使用程序出现问题导致的问题。
如果正常编写是可以做四则运算的,而这里唯有的除法计算会造成什么样的问题呢?
结合上面的知识,我们知道这里需要编写一个 try-except 来处理,如果不进行处理,会造成两个问题,其一是让用户的使用感下降,尽量不要让用户体验到这种他看不懂的问题。其二是让攻击者有机可能,这种问题会导致你的程序被训练有素的攻击者攻击,他很有可能会通过的你 traceback 获取到你文件名称。

下面,我们通过 else 代码块的结合使用来处理这种现象:

4. else 代码块

这里我们继续将可能引发错误的代码放在 try-except代码块,来提高这个程序抵御错误的能力。但是这里还包含一个 elese 代码块,依赖于 try 代码块成功执行的代码都放到else 代码块中:

print('- - - 欢迎使用- 计算器 - - - ')
print('使用请按:'+'e'+',退出请按:'+'q')

while True:
	uInfo = input('请您开始录入:')
	if uInfo == 'q':
		break
	if uInfo =='e':
		number1 = input('请您录入被除数:')
		number2 = input('请您继续录入除数:')
	
		print('计算器正在为您计算结果....')
		
		try:
			answer = int(number1)/int(number2)
		except ZeroDivisionError:
			print('您不可以输入0作为除数!')
		else:
			print(answer)

在这段示例代码当中,我们将可能会出现错误的代码行放在 try中。程序在执行过程中遇到错误的话就会提示给用户我们提前设置好的内容,而不是显示给用户看不懂的非友好内容。
我们知道,如果程序按顺序执行成功,就会经过 try 代码块继续执行,这时的计算结 果就会在 else 语句中的代码行输出出来。也就是说 else 代码块写的的代码语句 都是经try 代码块运行成功后才需要运行的代码。

5. 处理 FileNotFoundError 异常

如果我们读取一个并不存在的文件,python 解释器会抛处什么样的异常呢?

filename = 'aa.txt'
with open(filename) as file_object:
	contets = file_object.read()

当然,我们并没有提前创建这个文件,
我们看一下这段代码的执行结果:
在这里插入图片描述
python 解释器开始报错了,
它显示 FileNotFoundError 异常,看来是因为 python 找不到要打开的文件,所以创建了这个异常。

其实这个错误是因为 open() 导致的。
处理这个问题也不难,记得我们今天学习的主旨是什么吗?
对,通过 tey-except 代码块来解决:

filename = 'aa.txt'

try:
	with open(filename) as file_object:
		contets = file_object.read()
except FileNotFoundError:
	print('很抱歉,您要读取的:'+filename+'文件不存在哦!')

加上 try 代码块后,在运行这段代码示例,如果还是出现问题,
他会提示给用户这样的信息:
在这里插入图片描述

其实要处理的文件并不存在。因此这样进行处理的意义也并不大。下面我们将这个示例进行扩展,看看你在使用多个文件时,异常处理可提供什么样的帮助。

6. 分析文本

这里先给大家介绍一个函数,split()。它根据一个字符串创建一个单词列表。
什么意思呢?

方法 split()
以空格分隔符将字符串拆分成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表。

现在,我们准备好一个文本文件,
在文本文件内部粘进寒窑赋的整篇内容。然后编写代码读取这个文件,
在成功读取之后,调用 split 函数分隔其中的元素,
最后输出分隔出来的内容,看看我们一共分隔了多少个元素:

filename = 'hyf.txt'

try:
	with open(filename) as file_object:
		contets = file_object.read()
		
except FileNotFoundError :
		print('很抱歉,您要读取的:'+filename+'文件不存在哦!')
else:
	words = contets.split()
	num_words = len(words)
	print('本篇文章一共包含段落:'+ str(num_words) +'个。')

在这段代码中,其实我们不处理可能出现的异常,程序也不会出现错误,
因为代码读取的该文本文件是存在的。

还有一点需要说明:
split() 函数是根据空格来拆分字符串存储为列表的。
所以执行这段代码,只有 7个段落行。

在这里插入图片描述

7. 失败时一声不吭

在这个标题里,想给大家介绍一个 pass 语句。
之前用到的 try 语句,都是 except 块中,设置了出现异常时显示给用户的友好信息,
但如果不想给用户显示内容呢?
我们可以利用 pass 语句:

try:
	#省略代码语句
except ZerroDivisionError:
	pass

这样编写的 except 代码块显示给用户既不会出现 traceback,也不会提示异常友好信息内容。而且 pass 语句还充当了占位符,它提醒你在程序的某个地方什么都没有做,并且以后也许要在这里做些什么。

猜你喜欢

转载自blog.csdn.net/tianlei_/article/details/129271963