web-dev-qa-db-ja.com

あらゆる例外のキャッチについて

すべての例外をキャッチするtry/exceptブロックを作成する方法

563
user469652

できますができません。

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
467
Tim Pietzcker

裸のexcept:節(他の人が使うべきではないと言っているように)を除いて、あなたは単に Exception をキャッチすることができます:

import traceback
import logging

try:
    whatever()
except Exception as e:
    logging.error(traceback.format_exc())
    # Logs the error appropriately. 

たとえば、終了する前に他の方法で捕捉されていない例外を処理したい場合は、通常、これをコードの最も外側のレベルで実行することのみを検討します。

exceptに対するexcept Exceptionの利点は、キャッチしない例外がいくつかあることです。最も明白なことは、KeyboardInterruptSystemExitです。

671
Duncan

一般的な例外を処理するためにこれを行うことができます。

try:
    a = 2/0
except Exception as e:
    print e.__doc__
    print e.message
89
vwvolodya

非常に単純な例で、ここにあるものと似ています。

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)「例外が発生しました。」または「すべてが素晴らしく見えます」例外がスローされたかどうかによって異なります。

お役に立てれば!

48
Joshua Burns

起こりうるすべての例外を捕捉するには、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))

しかし、他の人々が述べたように、あなたが非常に正当な理由がない限り、あなたは通常これをするべきではありません。

45
gitaarik

私はちょうどPython 2.7で例外名があるかどうかをテストするためのこの小さなトリックを見つけました。コード内の特定の例外を処理したことがあるので、その名前が処理された例外のリスト内にあるかどうかを確認するためのテストが必要でした。

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__# returns the name of the exception
14
Danilo

特に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()
7
grepit
try:
    whatever()
except:
    # this will catch any exception or error

これは適切なPythonコーディングではないことを言及する価値があります。これは、キャッチしたくないかもしれない多くのエラーもキャッチします。

4
Yuval Adam