質問
きしみやすく心のこもったいいものを除く取り扱いの例外はどうかという話があったようだな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')
...
>>>
ドキュメントのから:
完全に例外を抑制する任意の他の機構と同様に、 このコンテキストマネージャは、非常に特定のエラーをカバーするためにのみ使用する必要があります 黙ってプログラムの実行を続けるがあることが知られている場所 行うには正しい事ます。
suppress
とFileNotFoundError
は、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