说,我有两个功能bar()
和foo()
。 bar()
执行foo()
。
def foo():
try:
num = int( input("need an Integer") )
except ValueError:
print("input invalid")
def bar():
foo()
当我运行bar()
并键入非整数值时,我应该获得"input invalid"
消息。但是,如果我想在"input invalid"
中自定义此错误消息bar()
,而无需修改foo()
。
我该怎么办?
我尝试了以下操作,但这不起作用。
def foo():
try:
num = int( input("need an Integer") )
except ValueError:
print("input invalid")
def bar():
try:
foo()
except Exception as result: <-- this does not capture the error in foo()
print("my customized error message")
所需的输出是:"my customized error message"
而不是"input invalid"
(但如果我可以同时输出两条消息,则可以接受)
答案 0 :(得分:3)
您可以使用unittest.mock.patch
通过自定义函数临时覆盖内置print
函数,该函数使用原始的print
函数,如果传入的消息与要替换的消息,否则按原样打印消息:
from unittest.mock import patch
def custom_print(s, *args, **kwargs):
orig_print("my customized error message" if s == "input invalid" else s, *args, **kwargs)
orig_print = print
def bar():
with patch('builtins.print', new=custom_print):
foo()
bar()
答案 1 :(得分:0)
您基本上处于良好状态。您要做的是raise
中的一个foo
异常,您可以在bar
中捕获该异常。这是通过以下所示的raise命令完成的:
def foo():
try:
num = int( input("need an Integer") )
except ValueError:
raise Exception("input invalid")
def bar():
try:
foo()
except Exception as e:
print("my customized error message")
如果现在执行bar()
并引发异常,则可以在bar()
中捕获它并打印另一条消息。如果要获取原始消息,可以通过打印str(e)
来实现。