2015-10-19 9 views
5

(特定の)キャッチされた例外を再発生させ、同じtry-exceptを除いて後で(一般)にキャッチさせることができるのだろうかと思いました。例として、特定のIOErrorで何かをしたいのですが、期待されるIOErrorでない場合、例外は他のエラーと同様に処理する必要があります。最初に試したこと:Python 'except' fall-through

ただし、これは機能しません。raiseはtry-exceptのコンテキスト外で例外を再発生させます。 希望する例外の「フォールスルー」動作を得るために、これを書くためのPythonの方法は何でしょうか?

(私はこれを解決してきた可能性があり、実装されていないことを提案した「を除いて、条件が」あった承知している)

+1

「例外IOError」ブロックから「Exception」ブロックに移動したいと思っていますか?私が知る限り、これは不可能です。与えられた 'try'に対して' except'ブロック(または 'else'ブロック)が1つだけ実行されます。例外を除いて 'IOError'が外側の' try'の 'except'で終わることを意味する、' except Exception'を取り除いて、別の 'try'で全体をラップすることができます。 – jonrsharpe

+0

これは私がやりたいことであり、私は1つだけを除くことが可能であると心配していました。私は他のネストされた/コードの複製のようなより洗練されたソリューションを望んでいます – OverlordAlex

答えて

1

私はpythonically書面で専門家ではないが、私は(1つの明白なアプローチを考えますあなたが)あなたは例外の一つの特定の種類を期待していることがわかっている場合、ネストされた例外処理を使用することです:

try: 
    try: 
     raise IOError() 
    except IOError as ioerr: 
     if ioerr.errno == errno.ENOENT: 
      # do something with the expected err 
     else: 
      # pass this on to higher up exception handling 
      raise 

except Exception as ex: 
    # general error handling code 

私はあなたのコメントで知っているあなたは、ネストされた他の人の望んでいませんでした - 私は知りませんネストされた例外処理があなたの本のように悪い場合でも、少なくともコードの重複を避けることができます。

+0

これは素晴らしいアプローチです。非常にクールなアイデア! – iFreilicht

1

私はここで同じことをやっています。利用可能なソリューションを見直した後、親例外をキャッチして詳細をテストします。私の場合、私はdnsモジュールを使って作業しています。

try: 
    answer = self._resolver.query(name, 'NS') 
except dns.exception.DNSException, e: #Superclass of exceptions tested for 
    if isinstance(e, dns.resolver.NXDOMAIN): 
     #Do Stuff 
    elif isinstance(e, dns.resolver.NoAnswer): 
     # Do other stuff 
    else: 
     # Do default stuff 
関連する問題