2017-02-11 10 views
1

私はraise複数のExceptionsできる機能に取り組んでいます。私はこれらのブロックを例外ブロックに入れて処理し、カスタムメッセージとトレースバックで結果を返したいと思っています。問題はfinallyが保証されているので、elseブロック内に何も返すことができないということです。Try-Except-Else-最後にelseの代わりに戻りますか?

このコードは、Exceptionが発生しても動作しますが、Exceptionがない場合は動作しません。そのような場合は、ちょうど返信{'success':True}が必要です。したがって、このコードから

def foo(): 
    try: 
     #some code 
     return {'success':True} 
    except FirstException: 
     tb = traceback.format_exc() 
     msg = 'There was FirstExc' 
     return {'success':False, 
       'tb':tb, 
       'msg':msg} 
    except SecondException: 
     tb = traceback.format_exc() 
     msg = 'There was SecondExc' 
     return {'success':False, 
       'tb':tb, 
       'msg':msg} 
    ... 

私はreturnsを繰り返さないようにしたいです。私は試しました:

def foo(): 
    try: 
     pass 
    except FirstException: 
     tb = traceback.format_exc() 
     msg = 'There was FirstExc' 
    except SecondException: 
     tb = traceback.format_exc() 
     msg = 'There was SecondExc' 
    else: 
     return {'success':True} 
    finally: 
     return {'success':False, 
       'tb':tb, 
       'msg':msg} 

あなたはそれを行う方法を知っていますか?私はreturn {'success':True}tryブロックに入れて、finallyelseブロックを削除し、それぞれexceptブロックにreturn {'success':False,'tb':tb,'msg':msg}を追加しましたが、コードが複数回繰り返されるように多くのexceptブロックがあります。

別のオプションはありますか?

答えて

1
def foo(): 
    success = False 
    try: 
     pass 
    except FirstException: 
     tb = traceback.format_exc() 
     msg = 'There was FirstExc' 
    except SecondException: 
     tb = traceback.format_exc() 
     msg = 'There was SecondExc' 
    else: 
     success = True 
    finally: 
     return {'success':success, 
       'tb':tb, 
       'msg':msg} if not success else {'success':success} 

代替:上記の

def foo(): 
    result = {"success": False} 
    try: 
     pass 
    except FirstException: 
     result['tb'] = traceback.format_exc() 
     result['msg'] = 'There was FirstExc' 
    except SecondException: 
     result['tb'] = traceback.format_exc() 
     result['msg'] = 'There was SecondExc' 
    else: 
     result['success'] = True 
    finally: 
     return result 

僅かな変動:

def foo(): 
    result = {"success": False} 
    try: 
     pass 
    except FirstException: 
     result.update({'tb': traceback.format_exc(), 'msg': 'There was FirstExc'}) 
    except SecondException: 
     result.update({'tb': traceback.format_exc(), 'msg': 'There was SecondExc'}) 
    else: 
     result['success'] = True 
    finally: 
     return result 
+0

条件式は、これはかなり読めなくなります。 '成功しなければreturn:{...}'を使い、次の行で 'return {...}'を使うだけです。 'else:'を使う必要はありません。 –

+0

NameErrorを発生させます。 –

+0

@brunodesthuilliers:いいえ、そうしないでしょう。 'success'が' True'の場合、条件式は最初の部分をまったく実行しません。 *ただし、*、最後の行で条件式を使用するために見えにくいです。 –

2

ブロックfinallyを使用しないでください。例外の場合はFalse、そうでない場合はTrueを返します。 finallyでの返信は、常に両方の場合に適用されます。

exceptスイートから戻っても、スイートを組み合わせてもかまいません。

def foo(): 
    try: 
     pass 
    except FirstException: 
     tb = traceback.format_exc() 
     msg = 'There was FirstExc' 
     return {'success':False, 
       'tb':tb, 
       'msg':msg} 
    except SecondException: 
     tb = traceback.format_exc() 
     msg = 'There was SecondExc' 
     return {'success':False, 
       'tb':tb, 
       'msg':msg} 
    else: 
     return {'success':True} 

あなたが一つにexceptスイートを組み合わせることができます:

def foo(): 
    try: 
     pass 
    except (FirstException, SecondException) as e: 
     tb = traceback.format_exc() 
     exception_type = 'FirstExc' if isinstance(e, FirstException) else 'SecondExc' 
     msg = 'There was {}'.format(exception_type) 
     return {'success':False, 
       'tb':tb, 
       'msg':msg} 
    else: 
     return {'success':True} 

別のオプションは、その情報を追加し、戻り値最初を構築することでより多くの繰り返しに両方のリード線からの復帰

必要に応じて:

def foo(): 
    result = {'success': True} 
    try: 
     pass 
    except FirstException: 
     tb = traceback.format_exc() 
     msg = 'There was FirstExc' 
     result = {'success': False, 'tb': tb, 'msg': msg} 
    except SecondException: 
     tb = traceback.format_exc() 
     msg = 'There was SecondExc' 
     result = {'success': False, 'tb': tb, 'msg': msg} 
    finally: 
     return result 

しかし、これは実際にはreturn-except-except-suiteオプションとは異なるものではありません。

関連する問題