我有一個看起來像的代碼塊:
try:
if x == 1:
a()
if x == 2:
b()
if x == 3:
c()
except Exception:
raise Exception("Problem in function")
每個函式a(),b()和c()都可以有例外。無論如何我可以通過一條訊息引發例外,該訊息告訴哪個函式導致了例外。
我想知道這里是否可以不使用try, 分別catch在每個函式中使用陳述句。
uj5u.com熱心網友回復:
我會想到的第一件事是嘗試這樣的事情:
try:
if x == 1:
a()
if x == 2:
b()
if x == 3:
c()
except Exception:
raise Exception("Problem in function, x=%s"%x)
現在,當引發例外時,您可以看到 x 的值是什么。
對于更詳細的內容,也許是這樣的:
try:
if x == 1:
flabel = 'func_a'
a()
if x == 2:
flabel = 'func_b'
b()
if x == 3:
flable = 'func_c'
c()
except Exception:
raise Exception("Problem in function %s"%flabel)
uj5u.com熱心網友回復:
這可能對您的示例過于具體,但我通常會嘗試重構代碼并具體說明將要執行的函式。
if x == 1:
func_name = "a"
func = a
elif x == 2:
func_name = "b"
func = b
elif x == 3:
func_name = "c"
func = c
try:
func()
except Exception:
raise Exception(f"Problem in {func_name}")
只要所有三個函式都以其“原始”名稱參考,您也許可以擺脫func_name并使用func.__name__它們。
uj5u.com熱心網友回復:
你可以試試
import traceback
try:
if x == 1:
a()
if x == 2:
b()
if x == 3:
c()
except Exception as excp:
stack = traceback.extract_stack()[:-3] traceback.extract_tb(excp.__traceback__)
(filename, line, procname, text) = stack[-1]
print (f" func {procname}")#
raise Exception("Problem in function")
uj5u.com熱心網友回復:
您可以定義一個裝飾器函式來包裝另一個,以便獲得所需的資訊(這是@chepner答案的變體):
def decorator(func):
wraps(func)
def wrapper(*args, **kwargs):
global func_name
func_name = func.__name__
return func(*args, **kwargs)
return wrapper
@decorator
def a():
pass
@decorator
def b():
raise RuntimeError('Uh Oh!')
@decorator
def a():
pass
x = 2
try:
if x == 1:
a()
if x == 2:
b()
if x == 3:
c()
except Exception as exc:
raise Exception(f"Problem in function {func_name}()")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403719.html
標籤:
上一篇:理解關于數字倍數的代碼
