Python在类声明中抛出用户定义的异常

时间:2018-02-16 06:24:25

标签: python exception exception-handling

我试图捕获函数内部的异常,并在顶级功能中处理函数之外的函数。我找到了许多用于创建用户定义函数的很好的资源,以及我如何使用raise来捕获它们,但它没有弄清楚我期望的方式。

我定义了两个函数DontThrowMyException。什么都没有抓住DontThrow所以它永远不应该被处理,但是第二个我的代码进入类级别,这正是为什么我标题它不要做!就像python从上到下阅读所做的一切,无论它是否被抓住了什么

如果引发异常,我怎么能只处理它们?

import sys

class DontThrow(Exception):
    print("You shouldn't see this")
    sys.exit(1)

class MyException(Exception):
    print("Bad exception")
    sys.exit(1)

def main():
    x = 5
    try:
        if x < 6:
          raise MyException
    finally:
        pass

输出:
You shouldn't see this

2 个答案:

答案 0 :(得分:2)

Python异常是类,并且在定义时执行类。

例如,请考虑以下代码:

import sys
class test:
    print("hey")
    sys.exit()

在此test中永远不会实例化,但会调用print语句。我怀疑这对你来说是一个惊喜,但这是你所看到的行为的原因。

如果您希望退出异常,程序会在except块中具有该行为,而不是异常本身。

这对于您当前的异常层次结构如何工作将是这样的:

import sys

class DontThrow(Exception):
    pass

class MyException(Exception):
    pass

def main():
    x = 5
    try:
        if x < 6:
            raise MyException
    except DontThrow:
        print("You shouldn't see this")
        sys.exit(1)
    except MyException:
        print("Bad exception")
        sys.exit(1)
    else:
        print("no exception was thrown")
    finally:
        print("This always gets called")

if __name__ == "__main__":
    main()

请注意,未捕获的异常无论如何都会退出程序,因此如果没有抓住某些内容,则无需尝试直接调用sys.exit()

答案 1 :(得分:-3)

这取决于类定义的顺序。如果您更改下面的顺序,则输出就像Bad exception

import sys

class MyException(Exception):
    print("Bad exception")
    sys.exit(1)

class DontThrow(Exception):
    print("You shouldn't see this")
    sys.exit(1)

def main():
    x = 5
    try:
        if x < 6:
          raise MyException
    finally:
        pass