【问题标题】:python calling custom exceptions from if-statement and try-exceptpython从if语句和try-except调用自定义异常
【发布时间】:2013-04-01 08:12:04
【问题描述】:

因此,我创建了一个自定义异常,我想以 2 种不同的方式调用它(if/else 语句和 try/except 语句)。这是自定义异常:

class CustomException(Exception):   
   def __init__(self, value=None, *args, **kwargs):
     self.parameter = value
     for key, value in kwargs.items():
         setattr(self, key, value)

     for key, value in self.__dict__.items():
         print "%s => %s" % ( key, value ) 

   def __str__(self):
     return repr(self.parameter)

这是我想要实现自定义异常的方式:

try:
   if something:
       #make an error
       ;lsdfj
   else:
       raise CustomException('this is my custom message', file='somefile.txt', var2='something')
except Exception, e:
   raise CustomException(e)

我认为我的问题有两个方面:

1:当try/except块中抛出的标准NameError时(由于;lsdfj),我想传递CustomExceptions一些额外的参数,如'file',就像if/else实现一样;我该怎么做?

2:当引发自定义异常时(从 if/else 语句为假),CustomExceptions 类最终会被调用两次,因为我在 if/else 块中引发了它,然后它在 @987654328 中再次引发@ 部分。我不知道如何解决这个问题。

因此,在上述情况下,我想在 if-statement 不正确时调用 CustomException,并且我想在代码块内抛出标准异常时调用它......但目前,if something:评估为 false 则 CustomException 将被提升两次...

所以我希望自定义异常在我的代码中单方面用于if/else 条件和标准 python 异常...

我知道这个解释令人费解,但我不确定如何解释我所追求的...任何帮助将不胜感激!提前致谢!

【问题讨论】:

    标签: python exception if-statement error-handling custom-exceptions


    【解决方案1】:

    您可以在except 块中使用:

    if not isinstance(e, CustomException): raise CustomException(e)

    编辑:

    except 内的raise 之前的sys.exc_info() 将成功删除对异常源的回溯,即NameError

    【讨论】:

    • 所以,如果我使用这个解决方案,当我试图避免NameError引发异常时,我也会得到异常回溯......(在 if/ else 语句工作正常)。有什么办法不显示回溯?
    • 来自NameError 的原始回溯似乎被抑制了,但我仍然从CustomException raise 事件中获得回溯......
    • 恐怕您将不得不使用sys.excepthook 并向其发送定制的traceback instance
    • 我应该在哪里打印traceback,在调用后的底层还是最高层? @流血的手指
    【解决方案2】:

    为了不引发两次异常,您应该仅将 try/except 块包裹在 if 语句周围,如下所示:

    if something:
       try:
           #make an error
           ;fdsfas
        except Exception, e:
            raise CustomException(e.message, file='somefile.txt', var2='something')
    else:
        raise CustomException('this is my custom message', file='somefile.txt', var2='something')
    

    并且为了传递自定义异常一些参数,您必须像在if/else 语句中那样将这些参数提供给类的构造函数。

    【讨论】:

    • 我可以给你一个更复杂的解决方案,如果这会让你感觉更好:)
    • 哈哈,别误会,我不是为了复杂而复杂的粉丝,我只是担心在某些情况下我需要尝试/除了外面if/else,在这种情况下,我回到第一方......对吗?
    • 除非您期望条件失败(例如if 5 is equal to 5 将引发无效语法错误,因为equal 在python 中不是关键字),否则无需担心。 if分支的代码被try/except包裹,所以不会出错,而else只有1行所以不会出错。
    • 虽然我越来越喜欢这个解决方案,但我遇到的问题与发布的其他解决方案相同...如何防止追溯发生在外部块上?
    • 我不明白。你能详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2014-12-31
    • 2020-02-25
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多