python练习生|python中关于异常(报错)的实用小知识(异常的简介、异常的处理、try...except...语句、异常的传播、异常对象、Exception)

python练习生|python中关于异常(报错)的实用小知识(异常的简介、异常的处理、try...except...语句、异常的传播、异常对象、Exception)

一.异常

1.异常的简介

  • 不可避免地,程序在运⾏过程中可能会出现⼀些错误。例如:使⽤了不存在的索引、对象未声明、不同类型的数据相加…我们把错误我们称之为异常。

2.异常的处理

  • 处理异常:当程序在运⾏过程中出现异常,⽬的并不是让我们直接对程序进行终⽌!而是希望在出现异常情况时,可以及时反馈给程序猿,对异常情况进行及时的响应。

#由这三行简单的print语句,我们可以看出,异常以后的代码都不会执行。
print('我准备好了!')
print(b)
print('鲜花')

三行代码

(1).try except 语句

  • 当我们面临着对代码的正确与否缺乏判断或者我们对代码进行检测时,我们会用到 try…except 语句
  • 就拿上面三行代码的简单例子来说
print('我准备好了!')
try:
    print(b)
except:
    print('这行代码有问题呢')
print('鲜花')

try语句

  • 有同学在之前可能了解过,可能会说,还有 else语句 呢!
  • 不着急,下面就是else语句了
print('我准备好了!')
try:
    print('b')
except:
    print('这行代码有问题呢')
else:
    print('这行代码没有问题')
print('鲜花')

else

  • 细心的你通过这几行代码发现了一些东西: 那就是 try 、except、else 在进行异常判断时的基本用法

(2).处理异常语句的基本用法

# try except  语句
try:
    代码块 (这是可能出现错误的语句)
except:
    代码块 (如果出现错误,我的后续处理方式)
else:
    代码块(如果没有出错,我会执行的语句)
finally:
    代码块 (无论是异常还是正常,这块代码都会执行)

3.异常的传播

  • 再说异常的传播之前,我们看一些基本的小栗子:
# 异常的传播
def fn():
    print(a)

def fn1():
    print('我是fn1函数')
    fn()

def fn2():
    print('我是fn2函数')
    fn1()

fn2()

异常的传播

  • 由上述例子我们可以看出其实是 fn() 出现了异常。
  • 如果我们没有对异常进行处理,那么异常就会继续向函数调用处传播,直到传递到全局作用域。如果依然没有处理,则程序终,并显示异常信息。
  • 从而导致 fn1()和fn2() 都出现了异常。当然,最后调用fn2()也会出现异常。
  • 当我们对异常进行了处理,那么异常就不会再继续传播了。
def fn():
    print(a)

def fn1():
    print('我是fn1函数')
    fn()

def fn2():
    print('我是fn2函数')
    fn1()
try:
    fn2()
except:
    pass

处理异常

  • 当程序在运行过程中出现了异常,那么这个异常信息会被保存到一个专门的异常对象中。而异常的传播其实就是将异常对象抛给了调用处。
  • 那么,问题来了,什么是异常对象?

4.异常对象

# print(a)  # NameError: name 'a' is not defined
print(NameError,type(NameError))

异常对象01
异常对象02

  • 异常对象其实就是报错的异常信息是一个对象,由上图可得,异常对象是一个名为 NameError的类

(1).常见的异常对象(报错)

异常对象 异常的描述
ImportError 无法引用模块造成的异常
AttributeError 属性错误引发的异常
IndexError 超出索引范围引发的异常
NameError 未声明(初始化)对象造成的异常
StopIteration 停止迭代引发的异常
SyntaxError 语法错误引发的异常
TabError 空格缩进与tab缩进不一致引发的异常
TypeError 操作或功能应用于不合适类型的对象时引发的异常
KeyError 在字典中,未找到key引发的异常
ZeroDivisionError 除法或模运算的第二个自变量为零时引发的异常

这里是引用

内置异常

引用结束


(2).异常对象的获取

  • 我们都知道,当我们在运行代码出现异常的时候,我们的所有信息都被装到异常对象中了,那么我们如何获取异常对象呢?
  • 如果在 except 后面不加内容,那么,它会捕获所有异常。
  • 如果加入了异常对象,则只捕获相应的异常。如果要报的异常对象与加入的异常对象不是同一个,则会报错。

捕获对应的异常对象:

print('异常出现前')
try:
    print(a)
    # b = 'abc'
    # print(5+b)
except NameError:
    print('我要开始处理异常情况了')
print('异常出现后')

异常捕获01
捕获其他异常对象:

print('异常出现前')
try:
    # print(a)
    b = 'abc'
    print(5+b)
except NameError:
    print('我要开始处理异常情况了')
print('异常出现后')

异常捕获02

(3).异常对象获取的语法

# try-except 语句
try:
    代码块(可能出现错误的语句)
except 异常类型:
    代码块(出现错误以后的处理⽅式)
    
except 异常类型 as 异常名:
    代码块(出现错误以后的处理⽅式)
...
else:
    代码块(没出错时要执⾏的语句)
finally:
    代码块(是否出错该代码块都会执⾏)
    
#注意:try是必须的,else有没有都可以,except和finally⾄少有⼀个。

注意:try是必须的,else有没有都可以,except和finally⾄少有⼀个。


  • 值得一提的是,如果你在看python官方文档:内置异常时比较的细心,你会发现我们所有的内置异常,其实都有一个‘爹’,它就是 Exception
    Exception

(4).异常对象的父类(Exception)

# Exception
print('异常出现前')
try:
    print(a)
    b = 'abc'
    print(5+b)
except Exception:
    print('虽然出现了异常,但是我不知道错误是什么')
print('异常出现后')

父类01

  • 调用Exception也可以进行异常在控制台的输出。
  • 但是,如果我们想知道,我们的异常出现在什么地方呢?
  • 我们可以这样对代码进行改进
print('异常出现前')
try:
    print(a)
except Exception as m:
    print('出现了异常,异常为:',m)
print('异常出现后')

代码改进

猜你喜欢

转载自blog.csdn.net/weixin_45095678/article/details/107488008
今日推荐