python从if语句和try-except调用自定义异常

时间:2013-04-09 18:28:14

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

所以,我创建了一个自定义异常,我想以两种不同的方式调用它(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语句为false),CustomExceptions类最终被调用两次,因为我在if / else块中引发它然后在{{{ 1}}部分。我不知道怎么解决这个问题。

所以,在上面的例子中,我想在except:不为真时调用CustomException,并且我想在代码块中抛出标准异常时调用它...但是当前,{ {1}}评估为false,然后if-statement将被提升两次......

所以我希望在if something:条件的代码中单方面使用自定义异常,以及标准的python异常......

我知道这个解释很复杂,但我不知道怎么解释我在追求什么......任何帮助都会非常感激!提前谢谢!

2 个答案:

答案 0 :(得分:2)

为了不引发异常两次,你应该只在try/except statemnt周围包裹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语句中一样。

答案 1 :(得分:1)

您可以在except区块中使用:

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

修改

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