本章所说的就是我们经常遇到的一个问题,报错、异常。我们应该如何处理,让它不影响后面的程序运行。
异常
首先我们看看一个简单的示例。
print(2/0)
其结果可想而知,当然是报错了!程序被终止了!
这里会提示用户,指出这个异常对象,有没有什么办法不让它报这样的错误呢,当然有!
try-except就可以帮助到我们。
try: print(2/0)except ZeroDivisionError: print('不能这样计算哦')
用法:try:里面是主程序,except:里面写打印提示语句或者其他的程序都可以
清安这里except里面还加入了异常ZeroDivisionError,这里不加也是可以的哦,其效果类似。当然,如果你想准确捕捉异常的话,肯定还是需要加上的。
来看看我们处理python的异常后的效果:
其实,这里有点类似于if-else,但是这里先由主程序运行,再到判断,再到避免,避免成功后继续运行代码。看看下面的示例吧。
补充点:
try: print(2/0)except ZeroDivisionError as e: print(e, '不能这样计算哦')
这里比上述多写了一个as e,为什么呢,打印默认错误提示。但是后面我仍然写了我们想要它给我的一个错误提示,这里主要是起一个对比作用,实际情况上,这里写一种就好。
另外,异常种类有很多,这里并没有一一列举了,各位学完可以自己慢慢琢磨。
3.1、正确使用异常,避开崩溃
while True: first_name = input("请输入名字:") if first_name == 'zhangsan': break last_name = input("请输入名字:") if last_name == 'lisi': break full_name = int(first_name + last_name) print(full_name)
这段程序,看似没什么问题,当我们输入英文字符的时候,就会报错了,因为清安加了一个int类型的字符转换进去哦。非整型相加就会报错!!!
看到了吧报了ValueError错误,接下来我们避免它:
while True: first_name = input("请输入名字:") if first_name == 'zhangsan': break last_name = input("请输入名字:") if last_name == 'lisi': break try: full_name = int(first_name + last_name) except: print("整型不能这样相加哦!") else: print(full_name)
这里我们就可以避免它因为报错而终止程序了,从未接着运行代码,看效果:
这里就成功的避开了异常告示,我们可以继续进行while循环。
3.2、处理FileNotFoundError错误
这里其实就是找不到文件,而报出的异常。让我们看例子:
with open('name_t.txt','r') as nt: come = nt.read()
我们读取一个没有创建的文本,python就会告诉我们:
没有发现name_t.txt文件,处理方式呢,跟上处相类似。
try: with open('name_t.txt','r') as nt: come = nt.read()except: with open('123.txt','r') as rd: come_1 = rd.read() print(come_1.split()) print("没有找到这个文件哦")
这里为了更好的辨别的。我们使用两个文本做了对比,使用try-except做了一个判断,打开了第一个文件name_r.txt文件,并读取,后面我们使用except做了打开另一个文件并且读取并输出内容。split是将文本中的内容以空格为分隔符将字符串拆分多个部分,呈现列表的形式给倒我们。
解惑:这里也就先当与判断有没有name_t.txt文件,没有文件python就会报出异常,我们使用except输出一个没有找到文件,将这个错误避开。进而执行下一步操作,打开另一个文件。
又有好奇宝宝问了,这里你得with跟最后一个print同级,不是先运行第一个再后面吗,这里我们再try运行后下一步就已经执行了except了,所以只是打印结果的前后顺序不同而已。
3.3、使用函数打开多个文件
def name_txt(file_name): try: with open(file_name,'r') as nt: nt = nt.read() except: print("没有找到这个文件哦") else: print(nt.split())file_name = ['123.txt','321.txt','dog.txt']for file_names in file_name: name_txt(file_names)
这里我们传递多个文本文件使用的是for循环的方式,定义一个形参,将形参给到with open,并且我们用try-except做了避免错误的方法,让循环可以循环整个列表,清安这里还给出了一个没有的文本文件验证这个错误是否正常避免哦。
3.4、让避免信息不显示
def name_txt(file_name): try: with open(file_name,'r') as nt: nt = nt.read() except: pass else: print(nt.split())file_name = ['123.txt','321.txt','dog.txt']for file_names in file_name: name_txt(file_names)
我们只需要直接将避免错误的信息去掉就好了,改成pass直接忽略掉这个错误信息即可。
注:这里告诉你的是最简便的方法,此类还有很多的详细用法,但是作为快速上手,这类方法先做了解,后续会慢慢详细的讲解
3.5、不论怎样都执行
try: print(2/0)except: print("不能这样算,回去好好复习")finally: print('你好笨')
这里的finally不论怎么样,它都会执行。此处做一个了解,看你得需求怎么样,根据实际情况来定,看是否需要用到finally。