作者Dong0129 (阿东)
看板Python
标题[问题] 关於程式运作时exception的问题
时间Fri Dec 6 17:21:57 2019
各位版友好,
最近在运用exception时遇到一个流程设计的问题,
假设我有3个函式,分别是a、b、c,
其中a会呼叫b和c,b会呼叫c
若是想做到只要有函式出现例外,整个程式就停止运作,
是否只能用判断式一一检查执行完的函式是否正常跑完呢?
还是有其他种作法呢?
如果只能用判断式一一检查被呼叫的函式执行结果,若a大量呼叫b和c,不就会充斥很多
判断式在a中吗?
附上范例...
#main.py
from test import test
if __name__=='__main__':
t=test()
t.test()
------------------------------------------------------------
#test.py
from ErrManager import ErrManager
from test2 import test2
class test:
def test(self):
try:
print("test:test2 begin")
t2=test2()
t2.test2()
print("test:test2 end")
except ErrManager as e:
print(e)
------------------------------------------------------------
#test2.py
from ErrManager import ErrManager
from test3 import test3
class test2:
def test2(self):
try:
print("test2:test3 begin")
t3=test3()
t3.test3()
print("tes2:test3 end")
raise ErrManager("Exception in test2")
except ErrManager as e:
print(e)
-------------------------------------------------------------
#test3.py
from ErrManager import ErrManager
class test3:
def test3(self):
try:
raise ErrManager("Exception in test3")
except ErrManager as e:
print(e)
-------------------------------------------------------------
#ErrManager
class ErrManager(Exception):
def __init__(self,arg):
self.arg=arg
-------------------------------------------------------------
我以为运作结果会印出
test:test2 begin
test2:test3 begin
Exception in test3
但实际上印出
test:test2 begin
test2:test3 begin
Exception in test3
tes2:test3 end
Exception in test2
test:test2 end
请问是我运用Exception的方式有错吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.137.25.175 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1575624119.A.9D8.html
※ 编辑: Dong0129 (114.137.25.175 台湾), 12/06/2019 17:22:39
1F:推 sherees: 你可以把try except写在b, c里面12/06 17:37
有的,设计上每个function都有自己的try-except,
但被呼叫的函式执行发生exception後,在呼叫的地方还是要检查一次才会停止运作...
※ 编辑: Dong0129 (114.137.25.175 台湾), 12/06/2019 17:49:30
2F:推 benson415: 如果要中断,何不raise error? 12/06 19:43
有的,我是使用自定义的例外,文末附上范例代码...若我对於Exception运用理解错误还
请提出指教。
※ 编辑: Dong0129 (220.137.94.193 台湾), 12/06/2019 22:19:21
※ 编辑: Dong0129 (220.137.94.193 台湾), 12/06/2019 22:19:54
※ 编辑: Dong0129 (220.137.94.193 台湾), 12/06/2019 22:23:17
3F:→ stucode: 因为你 except 把例外拦下来了,想让它向外传播的话 12/06 23:13
4F:→ stucode: 在最外层或你想处理例外的地方 try except 就好 12/06 23:13
5F:→ stucode: 如果想在中间做些 logging 可以先拦下来再 re-raise 12/06 23:13
6F:→ benson415: 按照你的写法,印出来的确实是会这样没错。如果真的 12/07 22:03
7F:→ benson415: 想中断又不大改的话就是直接在test3里面把except里的p 12/07 22:03
8F:→ benson415: rint(e)改成raise e 12/07 22:03
简单来说应该是我try-except写太多层吧?只要在最上层写一个try-except就好了...感谢
各位的指导
※ 编辑: Dong0129 (118.167.123.168 台湾), 12/08/2019 21:44:55