【问题标题】:Handling exception in main function interface主功能界面异常处理
【发布时间】:2021-09-22 02:43:31
【问题描述】:

我有一个主函数,它接受一个列表参数并处理列表中的每个元素。每当一个元素引发异常时,我都没有必要停止程序。问题是输入列表通过不同的函数传递,处理所有这些函数的异常很痛苦。

当列表中的当前元素引发异常时,有什么方法可以继续处理下一个元素?

假设 func3 在 list_[0] 处引发异常,然后 main 将继续从 func1 处理 list_[1],然后是 func2,... –

一些伪代码:

def main(list_) -> None:   
    func1(list_)
    func2(list_)
    func3(list_)

预期行为:

def main(list_) -> None:   
    try:
        func1(list_)
        func2(list_)
        func3(list_)
    except:
        continue with the next element
        print(Element i raise Exception..., Skipping i...)

【问题讨论】:

  • 您的编辑使问题变得不那么清晰,而不是更清晰。您是否打算致电func1(list_[0])func2(list_[1]) 等?或者调用整个列表中的每个函数?或者单独调用列表中每个元素的每个函数?也许您可以提供一些示例 func1...3 定义和 list_ 的值,并解释您期望发生的情况。
  • @Samwise 我应该调用 func(list_) 但 func 逐个元素地处理 list_ 元素。我希望只要有任何元素在 func 内引发异常,那么我的程序将跳过该元素并返回主函数并继续下一个元素。
  • 这需要发生在func 的定义中,而不是在它的调用者中。调用者看不到 func 对列表做了什么,更不用说告诉它“不,回去从你离开的地方继续”。这突出了您需要发布func 的示例定义,而不仅仅是maintry/except 需要发生在 func 正在执行的循环中。
  • 可以让main 将异常处理程序注入func,这可能会完成您正在寻找的工作——但我们需要实际的可运行代码!

标签: python function exception


【解决方案1】:

每个函数都需要在自己的try 块中。

def main(list_) -> None:
    for f in (func1, func2, func3):
        try:
            f(list_)
        except Exception as e:
            print(e)

【讨论】:

  • 很抱歉我的问题不是很清楚,我已经更新了
【解决方案2】:

使用“反转”的函数列表,这个while-loop 可能适合主函数的主体:

funcs = [funcN, funcN-1, …, func2, func1]
while any(funcs):
    try: funcs.pop()(list_)
    except: continue

【讨论】:

  • 这个跳过函数并继续进行下一个函数,我想要的是从输入列表中跳过元素。假设我们正在处理 list_[0],如果 list_[0] 引发异常,main 将继续处理 list_[1]。
【解决方案3】:

如果您的所有函数都具有相同的输入 list_,则其他答案应该足够了,并且由于简单性而更可取。但如果参数不同,您可能希望将对这些函数的调用包装在一个装饰器中,您可以在其中捕获错误:

样式 1

def catch_exc(func, *args, **kwargs):
    try:
        func(*args, **kwargs)
    except Exception as error:
        print(func, "Element i raise Exception..., Skipping i...", error)
    else:
        print(func, "Success")

def func1(list_): raise Exception("Anything")
def func2(list_): raise Exception("Something")
def func3(list_): return "Success"
def func4(list_): raise Exception("Whatever")

def main(list_) -> None:
    catch_exc(func1, list_)
    catch_exc(func2, list_)
    catch_exc(func3, list_)
    catch_exc(func4, list_)

main([1,2,3,4])

样式 2

def catch_exc(func):
    def wrapper(*args, **kwargs):  # Ideally decorate this with <functools.wraps(func)>
        try:
            func(*args, **kwargs)
        except Exception as error:
            print(func, "Element i raise Exception..., Skipping i...", error)
        else:
            print(func, "Success")
    return wrapper

@catch_exc
def func1(list_): raise Exception("Anything")
@catch_exc
def func2(list_): raise Exception("Something")
@catch_exc
def func3(list_): return "Success"
@catch_exc
def func4(list_): raise Exception("Whatever")

def main(list_) -> None:
    func1(list_)
    func2(list_)
    func3(list_)
    func4(list_)

main([1,2,3,4])

输出

<function func1 at 0x149f3d911c10> Element i raise Exception..., Skipping i... Anything
<function func2 at 0x149f3d911ee0> Element i raise Exception..., Skipping i... Something
<function func3 at 0x149f3d911f70> Success
<function func4 at 0x149f3d91b040> Element i raise Exception..., Skipping i... Whatever

【讨论】:

  • 很抱歉我的问题不是很清楚,我想继续处理列表中的下一个元素。假设 func3 在 list_[0] 处引发异常,然后 main 将继续 func1 中的 list_[1],然后是 func2,...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多