【问题标题】:python exit from class after handling exception处理异常后python退出类
【发布时间】:2017-05-05 10:15:57
【问题描述】:

我有这样的课:

class TestClass(object):
    def __init__(self, *args):
        try:
            ##  check some condition
        except:
            return
            ## Should exit class

    def do_something_else(self):
        ...

    def return_something(self):
        ##  return something

现在我正在尝试像这样调用类:

TestClass(arg1, arg2, ..).do_something_else()
somthing = TestClass(arg1, arg2, ..).return_something()

当我执行第一个命令时,我的条件失败并引发异常。 我想要的是,如果 __init__ 函数中发生一些异常,则不应调用 do_something_method 并且控制流应该转到第二个命令。

在第二个命令中,所有条件都满足,应该调用return_something函数。

我怎样才能做到这一点?

【问题讨论】:

  • 这听起来像XY problem。你没有“退出”一门课程——你实际上想做什么?
  • 我有一个分布式任务队列(芹菜),其中调用了这个函数。我想最小化 celery 中的错误日志并将错误存储在数据库日志中。这就是为什么在不满足条件的情况下初始化类时,我想将错误详细信息存储在我的数据库日志中并退出类。有一些方法返回数据,而另一些方法只处理一些其他数据。否则,我会从 __init__ 函数中调用函数。

标签: python


【解决方案1】:

也许我错了,但我会保持简单,使用标志变量并这样做:

class TestClass(object):
    def __init__(self, *args):
        self.flag=False
        try:
            ##  check some condition
        except:
            self.flag=True

    def do_something_else(self):
        if self.flag:
            #do what you want, e.g. call a second command
            return
        ...

    def return_something(self):
        ##  return something

【讨论】:

    【解决方案2】:

    我建议您在单独的函数中而不是在构造函数中处理异常情况

    代替

    TestClass(arg1, arg2, ..).do_something_else()
    

    try:
        obj = TestClass(arg1,arg2)
    except:
         pass
    else:
         obj.do_something_else()
    

    并从 init 方法中删除 try/except 语句。
    You shouldn't return anything from __init__ method

    【讨论】:

      【解决方案3】:

      您可以只创建一个 TestClass 类的对象,然后从 try 块返回“True”,从 except 块返回“False”。检查该值是 True 还是 Flase 并执行所需的功能。 创建对象将自动触发 init 方法并根据您的条件返回 true 或 false。检查返回值以决定是否执行所需的方法。

      【讨论】:

      • 不清楚你的意思。此外,__init__ 必须始终返回 None
      • 我的回答和这篇文章的第一个回答有些相似。但我不确定 init 是否必须始终返回“无”。先生,您能再澄清一点吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多