我试图捕获函数内部的异常,并在顶级功能中处理函数之外的函数。我找到了许多用于创建用户定义函数的很好的资源,以及我如何使用raise
来捕获它们,但它没有弄清楚我期望的方式。
我定义了两个函数DontThrow
和MyException
。什么都没有抓住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
答案 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