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)

私の問題は 2 つあります。

1:ブロックで標準NameErrorがスローされるとき (原因)、実装と同様に、「ファイル」などの追加のパラメーターを渡したい。どうすればいいですか?try/except;lsdfjCustomExceptionsif/else

2: カスタム例外が発生すると (if/else ステートメントが false であるため)、CustomExceptions クラスが 2 回呼び出されます。これは、if/else ブロックで例外を発生させ、except:セクション内で再度発生させるためです。これを回避する方法がわかりません。

したがって、上記のケースでは、if-statementが true でないときに CustomException を呼び出したいのですが、コード ブロック内でスローされた標準例外があるときに呼び出したいのですが、現在はif something:false と評価され、CustomException2 回発生します。 ...

したがって、カスタム例外をif/else条件のコード全体で一方的に使用し、標準の python 例外を使用する必要があります...

私はこの説明が複雑であることを知っていますが、私が求めているものを他にどのように説明すればよいかわかりません...どんな助けも大歓迎です! 前もって感謝します!

4

2 に答える 2

5

例外が 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カスタム例外を渡すには、ステートメントで行ったのと同じように、そのパラメーターをクラスのコンストラクターに提供する必要があります。

于 2013-04-09T18:35:45.427 に答える
3

exceptブロック内で次のように使用できます。

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

編集:

内側の前sys.exc_info()にあると、例外のソースへのトレースバックが正常に削除されます。raiseexceptNameError

于 2013-04-09T18:51:54.897 に答える