python基础_try...except...finally

1、为什么要有错误处理机制?

在程序运行过程中,总会遇到各种各样的错误,有了错误处理机制,可以帮助我们捕获错误信息,然后分析错误原因,同时让程序继续执行下去。

2、python 中的错误处理机制

python 语言中 通过try...except...finally... 

在try中运行可能出错的代码段,如果出错,则不会继续执行出错位置后面的代码,而是直接跳转至except 语句块中,执行excpet中的代码,执行完毕后如果还有finally 则继续执行finally中的代码

常见的格式如下:

try:
    '''可能出错的代码段'''
except Exception :
    raise    #将错误抛出
finally:
    '''执行完except 后 会执行这里'''

 

3、一个常见的例子:

class base:
    def f1(self):
        print('执行f1')

    def f2(self):
        print('执行f2')

    def f3(self):
        func_list = {'f1':self.f1,'f2':self.f2}
        while True:
            try:
                choice = input('请输入要执行的方法:')
                func = func_list.get(choice)
                print('try 出错之前还会执行')
                func()
                print('出错的位置之后不会执行')

            except ValueError as e:
                print('ValueError')
                raise e

            except TypeError:
                print('TypeError')
                raise
            #捕获这个异常对象,赋值给e
            except Exception :
                print('Exception')
                raise
            finally:
                print('有finally则必定会执行')


b = base()
b.f3()

'''
执行结果:
请输入要执行的方法:f5
try 出错之前还会执行
TypeError
有finally则必定会执行
Traceback (most recent call last):
  File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常3.py", line 35, in <module>
    b.f3()
  File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常3.py", line 16, in f3
    func()
TypeError: 'NoneType' object is not callable

Process finished with exit code 1



'''

过程分析:

1、输入f5, 在func_list中获取key为f5的值,返回一个None 赋值给 func 

2、在执行func()  执行的时候 报错,因为func 此时为None ,不是一个可执行的对象,代码运行至此的时候 ,python内置函数会抛出 一个 TypeError 类型 的一个错误对象, 

3、这个错误对象被 后面的 except TypeError  并执行 这个异常捕获中的语句块:打印 TypeError 最后抛出 错误对象 except 执行完毕

4、except 执行完毕后,后面还有finally,执行finally 语句中的代码 至此代码运行完毕

注意:在python 中异常捕获 是按照代码中定义的except顺序 去捕获对应的异常,例子中的顺序是:ValueError TypeError Exception  , 只要捕获到了其中某一个异常,这后续异常不再继续捕获

 

4、自定义类型的异常:

在python  一切皆对象,错误也不例外, 捕获一个错误实际上就是 捕获 该错误类型的一个实例,因此,错误并不是凭空产生的,而是有意创建并抛出的。Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误。

如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:

#
# 定义一个自定义类的异常
class ValueNotfind(Exception):
    '''当输出有误时,抛出此异常'''
    # 自定义异常类型的初始化
    def __init__(self,value):
        self.value = value
    # 返回异常类对象的说明信息
    def __str__(self):
        return ("{} 是非法的输入项".format(repr(self.value)))

def f3():
    func_list = ['f1', 'f2', 'f3']
    while True:
        try:
            choice = input('请输入要执行的方法:')
            if choice not in func_list:
                # 当输入的值不在list中的时候 抛出这个异常  <抛出的是自定义类的对象>
                raise ValueNotfind(choice)
            else:
                print('当前选择的是{}'.format(choice))
        #捕获这个异常类,这里的e其实是这个异常类的实例对象
        except ValueNotfind as e:
            # print(e.value) #还可以获取到 对象的实例变量相关 信息
            raise e  #抛出异常对象 即__str__里的内容
        #最后一般Exception 兜底
        except Exception as e1:
            print(e1)
        else:
            print('没有异常则会执行else中的这条语句')
        finally:
            print('如果有finally 则一定会执行finally中的语句')

f3()


'''
输入f4执行结果如下:
请输入要执行的方法:f4
如果有finally 则一定会执行finally中的语句
Traceback (most recent call last):
  File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常_自定义异常类.py", line 34, in <module>
    f3()
  File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常_自定义异常类.py", line 25, in f3
    raise e  #抛出异常对象 即__str__里的内容
  File "D:/pythonProject/PyDemo/DemoFile/捕获异常/捕获异常_自定义异常类.py", line 19, in f3
    raise ValueNotfind(choice)
__main__.ValueNotfind: 'f4' 是非法的输入项

Process finished with exit code 1



'''

 

过程:

1、先定义一个类,运行代码时,在指定条件下 把这个错误类的实例对象抛出

2、通过except 捕获后再进行后续处理

 

特别注意:

1、raise语句抛出的是一个错误的实例

2、except 捕获的时候 ValueNotfind as e:  这里的变量e 其实也是 这个错误的实例

3、捕获异常的时候 可以在最后捕获  Exception 表示捕获所有类型异常 (用于兜底) 

 

 

 

 

 

 



 

posted @ 2021-11-10 21:05  昆虫白  阅读(238)  评论(0)    收藏  举报