5

因此,我创建了一个自定义异常,我想以 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:当块NameError中抛出的标准时try/except(由于;lsdfj),我想传递CustomExceptions一些额外的参数,如'file',就像if/else实现一样;我该怎么做?

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

因此,在上述情况下,我想在if-statement不为真时调用 CustomException,并且我想在代码块内抛出标准异常时调用它......但目前,if something:评估为假,然后CustomException将引发两次...

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

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

4

2 回答 2

5

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

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语句中所做的那样将这些参数提供给类的构造函数。

于 2013-04-09T18:35:45.427 回答
3

您可以在except块中使用:

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

编辑:

Asys.exc_info()之前的raise里面except会成功移除异常源的回溯,即NameError.

于 2013-04-09T18:51:54.897 回答