例外を処理せずにtry-exceptを実行したいだけの場合、Pythonではどのように実行しますか?
以下はそれを行う正しい方法ですか?
try:
shutil.rmtree(path)
except:
pass
try: rob() except: run()
例外を処理せずにtry-exceptを実行したいだけの場合、Pythonではどのように実行しますか?
以下はそれを行う正しい方法ですか?
try:
shutil.rmtree(path)
except:
pass
try: rob() except: run()
回答:
try:
doSomething()
except:
pass
または
try:
doSomething()
except Exception:
pass
違いは、最初のものもキャッチしKeyboardInterrupt
、SystemExit
そのようなものは、から直接派生するのでexceptions.BaseException
はなく、から派生するということexceptions.Exception
です。
詳細はドキュメントを参照してください:
try: shuti.rmtree(...) except: pass
粗(あなたはスペルを間違えても、すべてのエラーを抑制しますshutil
その結果NameError
) -最低で行うexcept OSError:
一般的に、関心のあるエラーのみをキャッチすることがベストプラクティスであると考えられています。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:coercing to Unicode:need string or buffer、int found」というエラーが表示されます-おそらく無視したくないので、デバッグするのは難しいかもしれません。
間違いなくすべてのエラーを無視したい場合Exception
は、裸のexcept:
ステートメントではなくキャッチしてください。もう一度、なぜですか?
例外を指定しないと、たとえば次のものを使用する例外を含め、すべての例外がキャッチされます。SystemExit
sys.exit()
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
これを、正しく終了する以下と比較してください。
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
より優れた動作のコードを記述したい場合、OSError
例外はさまざまなエラーを表す可能性がありますが、上記の例では無視するだけなErrno 2
ので、より具体的にすることができます。
import errno
try:
shutil.rmtree(path)
except OSError as e:
if e.errno != errno.ENOENT:
# ignore "No such file or directory", but re-raise other errors
raise
shutil.rmtree
あなただけ使用するので、最良の例ではありませんignore_errors=True
、その関数のために...
まず、このスレッドからジャック・オコナーの答えを引用します。参照されたスレッドが閉じたので、ここに書きます:
「Python 3.4でこれを行う新しい方法があります。
from contextlib import suppress
with suppress(Exception):
# your code
これを追加したコミットは次のとおりです。http://hg.python.org/cpython/rev/406b47c64480
そして、これが作者のレイモンドヘッティンガーで、これと他のあらゆる種類のPythonの熱さについて語っています:https : //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")
また、次のように例外をキャプチャできることにも注意してください。
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print("Handling run-time error:", err)
...そして次のように例外を再発生させます:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
... Pythonチュートリアルの例。
例外を適切に無視する方法は?
これにはいくつかの方法があります。
ただし、例の選択には、一般的なケースをカバーしない単純なソリューションがあります。
の代わりに
try:
shutil.rmtree(path)
except:
pass
これを行う:
shutil.rmtree(path, ignore_errors=True)
これはに固有の引数shutil.rmtree
です。次のようにするとヘルプが表示され、エラー時の機能も使用できることがわかります。
>>> import shutil
>>> help(shutil.rmtree)
これは例の狭いケースしかカバーしていないため、これらのキーワード引数が存在しなかった場合の対処方法をさらに示します。
上記は例の狭いケースしかカバーしていないので、これらのキーワード引数が存在しない場合にこれを処理する方法をさらに示します。
suppress
コンテキストマネージャをインポートできます。
from contextlib import suppress
ただし、最も具体的な例外のみを抑制します。
with suppress(FileNotFoundError):
shutil.rmtree(path)
あなたは黙って無視しFileNotFoundError
ます:
>>> with suppress(FileNotFoundError):
... shutil.rmtree('bajkjbkdlsjfljsf')
...
>>>
ドキュメントから:
例外を完全に抑制する他のメカニズムと同様に、このコンテキストマネージャは、プログラムの実行を静かに続行することが正しいことであることがわかっている非常に特定のエラーをカバーする場合にのみ使用してください。
suppress
とFileNotFoundError
はPython 3でのみ使用できることに注意してください。
コードをPython 2でも機能させる場合は、次のセクションをご覧ください。
例外を処理せずに単にtry / exceptを実行したい場合、Pythonではどのように実行しますか?
以下はそれを行う正しい方法ですか?
try : shutil.rmtree ( path ) except : pass
Python 2互換コードpass
の場合、何もしないステートメントを作成する正しい方法です。あなたが裸を行うときには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
例外を処理せずにtry catchを実行したいだけの場合、Pythonではどのように実行しますか?
これは、例外が何であるかを印刷するのに役立ちます:(つまり、例外を処理せずにキャッチして、例外を印刷してください。)
import sys
try:
doSomething()
except:
print "Unexpected error:", sys.exc_info()[0]
try:
doSomething()
except Exception:
pass
else:
stuffDoneIf()
TryClauseSucceeds()
ちなみに、else句はすべての例外の後に進むことができ、tryのコードが例外を引き起こさない場合にのみ実行されます。
else
、このコンテキストでの適切な説明。そして、それを追加するfinally
と、常に実行されます(または例外なし)。
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...
shutil.rmtree(path, ignore_errors=True)
。ただし、これはほとんどの関数には適用されません。