Python中valueerror是什么错误(异常处理千万别这么干)

 分类:IT知识时间:2022-10-30 07:31:01点击:

脆弱的程序

如果程序不做任何异常处理,就会非常脆弱,任何一点小的问题,都会让它崩溃。

比如这个程序:

whileTrue: number = input('输入一个数字:') print(int(number)/2)

只要输入的不是数字,它就马上崩溃了:

输入一个数字:9527 4763.5 输入一个数字:hello Traceback (most recent calllast): File"/Users/maishu/git/wx_maishucode/code/092.py", line 4, in<module> print(int(number)/2) ValueError: invalid literal forint() withbase 10: 'hello'

异常处理让它健壮

针对这种情况,我们可以使用异常处理,捕获可以预知异常,那就健壮了。

whileTrue: try: number = input('输入一个数字:') print(int(number)/2) exceptValueError: print('请输入正确的数字')

就算输入的不是数字,也可以从容应对不崩溃:

输入一个数字:9527 4763.5输入一个数字:hello请输入正确的数字 输入一个数字:9528 4764.0输入一个数字:

在这里我们用异常捕捉的是ValueError,一种特定类型的错误。

如果会抛出其他错误,程序还是会退出的。这正是我们需要的!

做个类比:

?

你有一个下属,你希望他有一定的处理问题能力,不要随便有点事情都来找你哭诉。

但是如果出了大事,你还是希望它汇报给你的!

?

我们希望程序能够按照我们的设定处理相关的异常。如果出现未知的情况,我们希望程序报错给我们,程序员做相应的处理。

这种异常处理让它变成怪物

在上面的代码中,如果我们不指定ValueError,而是直接写except:,也就是这样:

whileTrue: try: number = input('输入一个数字:') print(int(number)/2) except: print('请输入正确的数字')

结果会怎样呢?看执行结果:

输入一个数字:9527 4763.5输入一个数字:hello请输入正确的数字 输入一个数字:dfs请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字 输入一个数字:^C请输入正确的数字

这个程序很健壮,输入hello不会有错。

但是,当我用Ctrl +C尝试退出程序的时候,「它不能退出了!!」

你是否碰到过一些程序,怎么关都关不掉?就是这么个效果。现在只有通过任务控制器去杀死进程。

这是因为:

?

空的except:语句会捕获所有异常,而退出程序也是一种异常,也被捕捉,造成无法退出程序。

?

健壮又不成为怪物应该怎样写?

如果我们想要很健壮,但又不那么变态,我们可以捕捉Exception类,而不是空的except:语句,也就是这样:

whileTrue: try: number = input('输入一个数字:') print(int(number)/2) exceptException ase: print(f'出错了:{e}')

运行结果:

输入一个数字:9527 4763.5 输入一个数字:hello 出错了:invalid literal for int() withbase 10: 'hello'输入一个数字:88.6出错了:invalid literal forint() withbase 10: '88.6'输入一个数字:^CTraceback (most recent calllast): File"/Users/maishu/git/wx_maishucode/code/092.py", line 4, in<module> number= input('输入一个数字:') KeyboardInterrupt

原因如下:

  • Exception是大部分常见异常的父类,什么ValueError, KeyError等都是它的子孙,都会被捕捉到。这样程序比较健壮。
  • 但Exception并不是系统异常的父类,比如KeyboardInterrupt等并不是继承自它,所以不会被它捕捉。当我通过键盘告诉程序要停止时,可以正常退出。
除注明外的文章,均为来源:老汤博客,转载请保留本文地址!
原文地址: