Python之自定义异常并抛出该异常

一. python中异常捕捉

python中捕捉异常模块try/except,其中python中有一些自定义的异常,具体如下
AttributeError 调用不存在的方法引发的异常
EOFError 遇到文件末尾引发的异常
ImportError 导入模块出错引发的异常
IndexError 列表月越界引发的异常
IOError I/O操作引发的异常,如打开文件出错等
KeyError 使用字典中不存在的关键字引发的异常
NameError 使用不存在的变量名引发的异常
TabError 语句块缩进不正确引发的异常
ValueError 搜索列表中不存在值引发的异常
ZeroDivisionError 除数为零引发的异常

1.1 捕捉异常并抛出

先通过一段代码看下python中异常的捕获,这里为了能清楚看到异常,使用traceback模块对异常进行了追踪

import sys
import traceback


class DefineError:

    def __init__(self):
        pass

    @staticmethod
    def fun_error():
        try:
            c = 1 / 0
        except Exception as e:
            info = sys.exc_info()
            # traceback.print_tb(info[2])
            traceback.print_exc()
            print(e, "here is error")


if __name__ == '__main__':
    obj = DefineError()
    obj.fun_error()

输出结果
Traceback (most recent call last):
  File "D:/work/code/auto_test/define_error.py", line 50, in fun_error
    c = 1 / 0
ZeroDivisionError: division by zero
division by zero here is error

我们可以看到出现了division by zero的错误

1.2 异常追踪和异常输出

上面我们可以看到traceback追踪到异常,接下来介绍异常的处理

class DefineError:

    def __init__(self):
        pass

    @staticmethod
    def fun_error():
        try:
            c = 1 / 0
        except Exception as e:
            info = sys.exc_info()
            traceback.print_tb(info[2])
            # traceback.print_exc()
            print(info, "****************")


if __name__ == '__main__':
    obj = DefineError()
    obj.fun_error()
输出结果:
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x00000277D8D5C948>) ****************
  File "D:/work/code/auto_test/define_error.py", line 50, in fun_error
    c = 1 / 0

使用sys.exc_info()对异常进行追踪后可以看到输出一个包含3个元素的元组,第一个元素是一个 ZeroDivisionError 类;第 2 个元素是异常类型 ZeroDivisionError 类的一个实例;第 3 个元素为一个 traceback 对象。其中,通过前 2 个元素可以看出抛出的异常类型以及描述信息,对于第 3 个元素,是一个 traceback 对象,无法直接看出有关异常的信息,还需要对其做进一步处理

try:
    func()
except:
    # 捕捉异常,并将异常传播信息输出控制台
    traceback.print_exc()
    # 捕捉异常,并将异常传播信息输出指定文件中
    traceback.print_exc(file=open('log.txt', 'a'))

其中使用traceback.print_exc追踪到的异常可以写入文件中

1.3 多异常捕获
    try:
        print(1 / 0)
    except(ZeroDivisionError, TypeError, NameError):  # NameError找不到名字(变量)时引发
        print('Your numbers were bogus....')

我们可以再一个异常捕获里面同时放多个异常捕获条件,实现多异常捕获

1.4 异常略过
class DefineError:

    def __init__(self):
        pass

    @staticmethod
    def fun_error():
        try:
            c = 1 / 0
        except:
            # traceback.print_exc()
            print("****************")


if __name__ == '__main__':
    obj = DefineError()
    obj.fun_error()

捕捉所有的异常,except后不指定任何异常类即可。但是这样使用会隐藏没考虑过的错误不推荐。更好的选择是使用except Except as e并对异常对象进行检查。这样也会使得不是从Except类派生而来的异常漏掉。像SystemExit和KeyboradInterrupt都是从BaseExcept(Except的超类)派生而来的

1.5 try结合raise自定义异常
# 先自定义一个异常抛出模块
class MyDefineError(Exception):

    def __init__(self, name, reason):
        self.name = name
        self.reason = reason


class Test:

    def __init__(self):
        pass

    @staticmethod
    def work(p):
        print("执行work函数")
        try:
            if p < 5:
                raise MyDefineError('自定义错误', "参数小于既定值")
        except MyDefineError as e:
            print("here is error info, name is %s: reason is %s" % (e.name,  e.reason))


if __name__ == '__main__':
    t = Test()
    t.work(4)
输出结果:
执行work函数
here is error info, name is 自定义错误: reason is 参数小于既定值

注意点:
自定义异常模块可以捕捉到自己模块定义的一些异常信息,但是系统内置的异常信息无法捕获到

猜你喜欢

转载自blog.csdn.net/qq_42707967/article/details/112174709