~~面向对象进阶(七)——异常捕获1.0~~

进击のpython


异常捕获


什么叫做异常捕获???我们分开来理解

什么是异常??什么又叫捕获呢?


异常?那不是你经常做出来的嘛

不信??

你看看这些,你熟悉不??


NameError: name 'w' is not defined
ValueError: invalid literal for int() with base 10: 'w'
TypeError: 'int' object is not iterable
SyntaxError: Non-UTF-8 code starting with '\xce' in file
    ...

是不是都是你曾经的杰作呢???

呐,又要开始学新的英语单词了

Error : 错误,异常

那么NameError就是变量异常

同理TypeError就是类型异常

看!一场是不是就出来了!

异常其实说白了不就是

你平时写代码出来的各种报错吗!

哈哈哈,扎铁了老心!


那既然我们已经知道了什么是异常了

那捕获呢?捕捉是个动词是吧

(哥哥,你别告诉我你不知道这是动词)

那我们为什么要捕获异常呢?

一个最简单的例子,我要输入两个数字,然后求和

因为用户的输入都是字符串类型是吧

(不知道???那我就想锤你了)

所以我们是不是还需要把字符串类型的数字变成整型

是不是就要用int()给他处理一下!

对吧!逻辑没问题吧

但是你又发现了,我要是输入的不是数字,就会给我报错

然后程序就终止了!

但是我想做的是报错了,我就跟他说你错了,然后程序重新运行

这要求不过分吧!那么就要用到异常捕获了!

如果你有异常,我就给你抓起来,不让你报错,那你程序不就能执行了嘛

如果我再想提示你个什么信息我就写出来就完事了呗

那理论有了,我们来看看这玩仍到底怎么写


两个关键字 try except


while 1:
    try:
        m = int(input("请输入第一个加数:"))
        n = int(input("请输入第二个加数:"))
        print(m + n)
    except:
        print("请输入数字")

用上面两个关键字把你要捕捉异常的代码放进去("就是你觉得可能会报错的代码块!")

这个写法格式就有点像 if-elif 的格式写法

好了!基本的格式和写法就是这样的

但是啊,以你现在的技术,你就会报一个错误??

想什么呢凑弟弟!

还不是改一个又出来一个错误!

那这么多错误,我想针对不同的错误,有不同的提示

要怎么写呢?????


这就用到了咱们最先的学到的那几个英语单词了

简单来说就是用 不同的网抓不同的鱼

我们有多少张网呢?

给你点常用的先感受一下

AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x

IOError 输入/输出异常;基本上是无法打开文件

ImportError 无法引入模块或包;基本上是路径问题或名称错误

IndentationError 语法错误(的子类) ;代码没有正确对齐

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError 试图访问字典里不存在的键

KeyboardInterrupt Ctrl+C被按下

NameError 使用一个还未被赋予对象的变量

SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError 传入对象类型与要求的不符合

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError 传入一个调用者不期望的值,即使值的类型是正确的

再给你点不常用的,你看看就好

ArithmeticError

AssertionError

AttributeError

BaseException

BufferError

BytesWarning

DeprecationWarning

EnvironmentError

EOFError

Exception

FloatingPointError

FutureWarning

GeneratorExit

ImportError

ImportWarning

IndentationError

IndexError

IOError

KeyboardInterrupt

KeyError

LookupError

MemoryError

NameError

NotImplementedError

OSError

OverflowError

PendingDeprecationWarning

ReferenceError

RuntimeError

RuntimeWarning

StandardError

StopIteration

SyntaxError

SyntaxWarning

SystemError

SystemExit

TabError

TypeError

UnboundLocalError

UnicodeDecodeError

UnicodeEncodeError

UnicodeError

UnicodeTranslateError

UnicodeWarning

UserWarning

ValueError

Warning

ZeroDivisionError

我们有这么多张网,怎么用呢?

上面的程序,如果我输入的是非数字是不是报的是ValueError

(你要不知道,你就把 try-except 去掉,然后输入非数字,你看看提示的是什么)

(别的找错方式也可以这样!)

那我们就可以这么写


while 1:
    try:
        m = int(input("请输入第一个加数:"))
        n = int(input("请输入第二个加数:"))
        print(m + n)
    except ValueError:
        print("请输入数字")

为什么说是和 if-elif 相似的格式呢?

if-elif 是不是多选一啊

我们也可以!


while 1:
    try:
        k
        m = int(input("请输入第一个加数:"))
        n = int(input("请输入第二个加数:"))
        print(m + n)

    except ValueError:
        print("请输入数字")

看,我是不是定义个变量,但是没有赋值,那就回报这个错误:NameError: name 'k' is not defined

我们要是想抓这条鱼,怎么做呢?多选一嘛!


while 1:
    try:
        k
        m = int(input("请输入第一个加数:"))
        n = int(input("请输入第二个加数:"))
        print(m + n)

    except ValueError:
        print("请输入数字")
    except NameError:
        print("含有未定义的变量")

对吧!是不是写法挺像 if-elif 的

如果你想两个不同的错误都提示相同的信息

你也可以进行合写!


except (ValueError,NameError)

那,是什么错误,都能捕获吗?????

我们下节再说!


*别走开*

*下节更精彩*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jevious

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值