すべての例外をキャッチするtry
/ except
ブロックをどのように書くことができますか?
sys.stderr
、場合によってはログに記録される場所以外に、このアプローチが適切な場所を考えるのは困難です。これは完全に有効で一般的な例外です。
try: whatever() except Exception as e: exp_capture()
か?
すべての例外をキャッチするtry
/ except
ブロックをどのように書くことができますか?
sys.stderr
、場合によってはログに記録される場所以外に、このアプローチが適切な場所を考えるのは困難です。これは完全に有効で一般的な例外です。
try: whatever() except Exception as e: exp_capture()
か?
回答:
あなたはできますが、おそらくすべきではありません:
try:
do_something()
except:
print "Caught it!"
ただし、これはのような例外もキャッチKeyboardInterrupt
し、通常はそれを望まないでしょうか。すぐに例外を再発生させない限り、ドキュメントの次の例を参照してください。
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
。BaseExceptionのものもキャッチする場合を除いて、明示的にベアを言う必要があります。
except:
(他の人があなたが使うべきではないと言っているように)裸の節を除いて、あなたは単にキャッチすることができますException
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
通常、これをコードの最外部レベルで行うことを検討するのは、たとえば、終了する前にキャッチされていない例外を処理したい場合だけです。
利点except Exception
裸の上にはexcept
、ほとんど明らかに、それはキャッチ文句を言わないことをいくつかの例外があるということですKeyboardInterrupt
とSystemExit
:あなたがキャッチし、それらを飲み込んだ場合、あなたはあなたのスクリプトを終了するには、誰のために懸命にそれを作ることができます。
Exception
。つまり、これはサブクラス化されない「例外以外」をキャッチしません。をint
例外として発生させることは不可能であり、そうしようとすると例外が発生することに注意してくださいTypeError
。これはexcept Exception
、そのような場合に囲み句によってキャッチされるものです。一方、古いスタイルのクラスは、サブクラスを持たない「非例外」として発生および修飾できます。Exception
これは、裸のexcept
句ではなく、except Exception
句ではキャッチされます。
sys.exit()
は通常、アプリが終了することを期待しますが、SystemExitをキャッチしても終了しません。同様に、実行中のスクリプト(WindowsではCtrl-Break)でControl-Cを押すと、エラーをキャッチせずにプログラムが停止することが期待されます。ただし、既存の前にクリーンアップを実行する場合は、これらのいずれかまたは両方をキャッチできます。
これを行うと、一般的な例外を処理できます
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
起こり得るすべての例外をキャッチするには、catchしBaseException
ます。例外階層の最上位にあります。
Python 3:https : //docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7:https : //docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
しかし、他の人が述べたように、通常、これは必要ではなく、特定の場合にのみ必要です。
ここにあるものと同様の非常に単純な例:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
すべての例外をキャッチしようとしている場合は、「print "例外をスローする可能性のあるアクションを実行しています。"」の代わりに、すべてのコードを「try:」ステートメント内に配置します。
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
上記の例では、次の順序で出力が表示されます。
1)例外をスローする可能性のあるアクションを実行する。
2)最後に、例外がスローされたかどうかに関係なく、tryステートメントを実行した直後に呼び出されます。
3)「例外がスローされました!」または「すべてが美しく見えます!」例外がスローされたかどうかによって異なります。
お役に立てれば!
これを行うには、特にPython 3.0以降で複数の方法があります。
アプローチ1
これは単純なアプローチですが、実際にどのコード行が例外をスローしているか正確にわからないため、お勧めしません。
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
アプローチ2
この方法は、各例外の詳細を提供するため推奨されます。以下が含まれます:
唯一の欠点は、tracbackをインポートする必要があることです。
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
try:
whatever()
except:
# this will catch any exception or error
これは適切なPythonコーディングではないことに言及する価値があります。これは、キャッチしたくない多くのエラーもキャッチします。