すべての例外をキャッチするtry
/except
ブロックを作成する方法
できますができません。
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
をキャッチすることができます:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
たとえば、終了する前に他の方法で捕捉されていない例外を処理したい場合は、通常、これをコードの最も外側のレベルで実行することのみを検討します。
except
に対するexcept Exception
の利点は、キャッチしない例外がいくつかあることです。最も明白なことは、KeyboardInterrupt
とSystemExit
です。
一般的な例外を処理するためにこれを行うことができます。
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
非常に単純な例で、ここにあるものと似ています。
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)「例外が発生しました。」または「すべてが素晴らしく見えます」例外がスローされたかどうかによって異なります。
お役に立てれば!
起こりうるすべての例外を捕捉するには、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))
しかし、他の人々が述べたように、あなたが非常に正当な理由がない限り、あなたは通常これをするべきではありません。
私はちょうどPython 2.7で例外名があるかどうかをテストするためのこの小さなトリックを見つけました。コード内の特定の例外を処理したことがあるので、その名前が処理された例外のリスト内にあるかどうかを確認するためのテストが必要でした。
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__# returns the name of the exception
特に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コーディングではないことを言及する価値があります。これは、キャッチしたくないかもしれない多くのエラーもキャッチします。