質問

きしみやすく心のこもったいいものを除く取り扱いの例外はどうかという話があったようだなPython?

は、以下の方をしていきますか?

try:
    shutil.rmtree(path)
except:
    pass
役に立ちましたか?

解決

try:
  doSomething()
except: 
  pass

または

try:
  doSomething()
except Exception: 
  pass

その違いは、最初のも捕 KeyboardInterrupt, SystemExit やれるというような誘導することができなから直接 exceptions.BaseException, ない exceptions.Exception.
ドキュメンテーションを参照詳しくは:

他のヒント

これは、一般的に興味のあるエラーをキャッチだけにベストプラクティスと考えられていますshutil.rmtreeの場合、それはおそらくOSErrorています:ます。

>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
    [...]
OSError: [Errno 2] No such file or directory: '/fake/dir'

あなたは黙ってそのエラーを無視したい場合は、あなたがどうなるます:

try:
    shutil.rmtree(path)
except OSError:
    pass

なぜ?誤って、文字列の代わりに関数に整数を渡す(何とか)あなたが言うように:

shutil.rmtree(2)

これはエラーになります。は - あなたはおそらく、デバッグが困難となり得ることを、無視したくないが「例外TypeError:Unicodeに強制変換が必要文字列またはバッファ、見つけINT」。 P>

は、を間違いなくがすべてのエラー、キャッチExceptionではなく、裸except:文を無視したい場合。ここでも、なぜ?

例外キャッチを指定しないの例えばSystemExitが使用するsys.exit()例外を含むすべてのの例外、ます:

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

正しく終了し、以下にこれを比較します:

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

あなたが今までより良い挙動するコードを書きたい場合は、 OSErrorする例外は様々なエラーを表すことができますが、一例では、我々は唯一のErrno 2を無視する上で、私たちは、より具体的な可能性があります:

try:
    shutil.rmtree(path)
except OSError, e:
    if e.errno == 2:
        # suppress "No such file or directory" error
        pass
    else:
        # reraise the exception, as it's an unexpected error
        raise

あなたは可能性も import errno

ifするif e.errno == errno.ENOENT:を変更
  あなただけの例外を処理せずにトライキャッチをしたい場合は、

、どのようにPythonでそれを行うのですか?

それはあなたが何を意味するかに依存して「取り扱い。」

あなたはどんな行動をとることなく、それをキャッチすることを意味している場合、

、あなたが投稿したコードは動作します。

あなたがスタックを上がっていくから、例外を停止することなく、例外に対してアクションをしたいという意味であれば、あなたはこのような何かをしたい:

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown

まず私はこのスレッドを引用しますに。私がここに書くので、参照スレッドを閉じてしまった。

は、「Pythonの3.4で来て、これを行うための新しい方法はあります:

from contextlib import suppress

with suppress(Exception):
    # your code
http://hg.python.org/cpython/rev:

ここではそれを追加したことをコミットです/ 406b47c64480する

ます。https:/

そして、ここでは、著者、レイモンドヘッティンガー、これと他のPython辛さのすべての種類の話です/youtu.be/OSGv2VnC0go?t=43m23sする

これまで私のほかには、Python 2.7と同等です

from contextlib import contextmanager

@contextmanager
def ignored(*exceptions):
    try:
        yield
    except exceptions:
        pass

次に、あなたは、Python 3.4のようにそれを使用します:

with ignored(Exception):
    # your code

完全の場合:

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print "division by zero!"
...     else:
...         print "result is", result
...     finally:
...         print "executing finally clause"

... のpythonチュートリアルのます。

また、あなたは、このような例外をキャプチャすることに注意します:

>>> try:
...     this_fails()
... except ZeroDivisionError as detail:
...     print 'Handling run-time error:', detail
  

どのように適切に例外を無視するには?

これを行うにはいくつかの方法があります。

しかし、例の選択は、一般的なケースをカバーしていないシンプルなソリューションを持っています。

実施例に具体

の代わりに

try:
    shutil.rmtree(path)
except:
    pass

これを行います:

shutil.rmtree(path, ignore_errors=True)

このはshutil.rmtreeに固有の引数です。あなたは、次の作業を実行して、その上にヘルプを参照してくださいすることができ、そしてそれはまた、同様にエラーの機能を可能にすることができます表示されます。

>>> import shutil
>>> help(shutil.rmtree)

これが唯一の例の狭いケースをカバーしているので、私はさらに、それらのキーワード引数が存在しなかった場合は、これを処理する方法を説明します。

一般的なアプローチ

上記は一例の狭いケースをカバーしているので、私はさらに、それらのキーワード引数が存在しなかった場合は、これを処理する方法を説明します。

新規のPython 3.4で:

あなたはsuppressコンテキストマネージャをインポートすることができます:

from contextlib import suppress

しかし、唯一の最も特定の例外を抑制します:

with suppress(FileNotFoundError):
    shutil.rmtree(path)

あなたは黙っFileNotFoundErrorを無視します:

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

ドキュメントのから:

  

完全に例外を抑制する任意の他の機構と同様に、   このコンテキストマネージャは、非常に特定のエラーをカバーするためにのみ使用する必要があります   黙ってプログラムの実行を続けるがあることが知られている場所   行うには正しい事ます。

suppressFileNotFoundErrorは、Python 3でのみ利用可能であることに注意してください。

あなたが同様のPython 2で動作するようにあなたのコードをしたい場合は、次のセクションを参照してください。

Pythonの2&3:

  

あなただけの例外を処理せずに除くのtry /をしたい場合は、   あなたはPythonで、それをどのように行うのですか?

     

これを行うには、次の正しい方法ですか?

try :
    shutil.rmtree ( path )
except :
    pass

はPython 2互換コードについては、passには-OPません声明を持っているための正しい方法です。あなたは裸except:を行うときには、それはexcept BaseException:GeneratorExit、およびKeyboardInterruptが含まSystemExitをやってと同じだし、一般的に、あなたはそれらのものをキャッチする必要はありません。

実際には、あなたがすることができますように、例外を命名のように特異的であるべきです。

ここでのPython(2)例外階層での一部です、そしてあなたが見ることができるようにあなたがより一般的な例外をキャッチした場合、あなたはあなたが期待していなかった問題を非表示にすることができます:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
... and so on

あなたはおそらくここにOSErrorのをキャッチしたい、と何のディレクトリが存在しない場合は、多分あなたは気にしない例外があります。

私たちはerrnoライブラリからのことの特定のエラー番号を取得し、我々は持っていない場合はリレイズすることができます:

import errno

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno == errno.ENOENT: # no such file or directory
        pass
    else: # we had an OSError we didn't expect, so reraise it
        raise 

注、裸の昇給は、あなたがこのケースで何をしたいおそらく元の例外を発生させます。私たちは本当に、明示的に例外処理のコードでpassする必要がないよう、より簡潔に書かれます:

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno != errno.ENOENT: # no such file or directory
        raise 
  

あなただけの例外を処理せずにトライキャッチをしたい場合は、   あなたはPythonで、それをどのように行うのですか?

これはつまり、例外を処理せずにキャッチを試みると、例外を印刷する例外は:(あるものを印刷するのに役立ちます。)

import sys
try:
    doSomething()
except:
    print "Unexpected error:", sys.exc_info()[0]
try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

FYI else句は、すべての例外の後に行くことができますし、試してみるのコードは、例外が発生しない場合にのみ実行されます。

Pythonでは、我々は他の言語に似た例外を処理するが、その差は、例えば、いくつかの構文の違いで、

try:
    #Your code in which exception can occur
except <here we can put in a particular exception name>:
    # We can call that exception here also, like ZeroDivisionError()
    # now your code
# We can put in a finally block also
finally:
    # Your code...

私は、複数のコマンドでエラーを無視するのに必要と fuckit のトリックをしました。

import fuckit

@fuckit
def helper():
    print('before')
    1/0
    print('after1')
    1/0
    print('after2')

helper()
ちょうどこのような

単にを引き上げるの関連する例外ます:

try:
     raise NameError('Joan')
 except NameError:
     print 'An exception just raised again by Joan!'
     raise

そのような単純な。 :)

の詳細については、このドキュメント読んでください: https://docs.python.org/3.6/tutorial/errors.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top