ときにあなたのプログラムの例外は異常(例外)が表示されます。あなたがファイルを読みたい、そのファイルが存在しない場合、例えば、どのように?それとも、プログラムの実行中に誤って行う方法、それを削除しましたか?これらの使用により異常を治療します。
あなたのプログラムでは、いくつかの無効な文があった場合は同様に、どのように行うには?Pythonは、このプロセスを実行しますリフト(上げる)がある場合、あなたに伝えるために、その小さな手間違い(エラー)。
1.エラー
あなたは、単純な想像できるprint
関数呼び出しを。我々は場合はprint
スペル誤ってPrint
起こるのだろうか?あなたは、最初の文字が大文字にあることがわかります。この例では、Pythonは*(レイズ)*構文エラーがスローされます。
>>> Print("Hello World")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Print' is not defined
>>> print("Hello World")
Hello World
あなたは気付くでしょうNameError
Pythonが検出されたエラーの位置を出力しますが、間違いがスローされました。** **間違いのエラーハンドラ(エラーハンドラ)です間違ったために何かをやって。
2.異常
**私たちは、ユーザの入力の内容を読み取るために**(み)てみます。押して、[ctrl-d]
何が起こるかを確認します。
>>> s = input('Enter something --> ')
Enter something --> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
EOFError
ここで呼ばれるPythonが指摘EOFError
ミスをし、それはファイルの末尾*(ファイルの終わり)*印(見つから表しctrl-d
起こらないはず実現が)一度に登場しました。
3.例外処理
我々は使用することができtry..except
、異常な状況に対処します。一般的に、我々は内の文一般的に言えばtry
、コードブロック、エラー処理部における我々のコードexcept
のコードブロック。
ケース(テキスト保存exceptions_handle.py
):
try:
text = input('Enter something --> ')
except EOFError:
print('Why did you do an EOF on me?')
except KeyboardInterrupt:
print('You cancelled the operation.')
else:
print('You entered {}'.format(text))
出力:
# Press ctrl + d
$ python exceptions_handle.py
Enter something --> Why did you do an EOF on me?
# Press ctrl + c
$ python exceptions_handle.py
Enter something --> ^CYou cancelled the operation.
$ python exceptions_handle.py
Enter something --> No exceptions
You entered No exceptions
我々は、例外または内のすべての可能なエラー文スローされtry
、コードブロックと、対応するエラーまたは例外プロセッサ(ハンドラ)except
句またはブロック。except
特定のエラーまたは例外またはエラーまたは例外を処理することができる句は、括弧内に記載されています。エラーまたは例外の名前がない場合、それはすべてのエラーと例外を処理します。
少なくとも一つ持つ必要性に留意しexcept
た文を、すべての単語try
の単語が関連します。それ以外の場合は、tryブロックは、ポイントは何かありますか?
エラーや例外がない場合は処理され、Pythonはデフォルトのハンドラを呼び出します、それだけで、端末プログラムを実行すると、エラーメッセージを出力します。私たちは、前の章で、このアプローチを見てきました。
あなたも持つことができますelse
での句try..except
のコードブロックが関連付けられています。else
例外が発生していないとき句が実行されます。
次の場合では、我々はまた、我々は、追加情報を取得できるように、例外オブジェクトを取得する方法を学びます。
4.スロー
あなたができるraise
珍しい文によって引き起こされる、具体的な方法は、名前間違っていたり、珍しい名前を提供するために、そして投げることです*(スローされます)*珍しいオブジェクト。
あなたは、エラーを引き起こすことができるかの例外は、直接または間接的に依存しなければなりませんException
(異常)派生クラス。
ケース(として保存exceptions_raise.py
):
# encoding=UTF-8
class ShortInputException(Exception):
'''一个由用户定义的异常类'''
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast
try:
text = input('Enter something --> ')
if len(text) < 3:
raise ShortInputException(len(text), 3)
# 其他工作能在此处继续正常运行
except EOFError:
print('Why did you do an EOF on me?')
except ShortInputException as ex:
print(('ShortInputException: The input was ' +
'{0} long, expected at least {1}')
.format(ex.length, ex.atleast))
else:
print('No exception was raised.')
出力:
$ python exceptions_raise.py
Enter something --> a
ShortInputException: The input was 1 long, expected at least 3
$ python exceptions_raise.py
Enter something --> abc
No exception was raised.
この例では、我々は我々自身の例外型を作成します。この新しい例外型が呼び出されますShortInputException
。これは、2つのフィールドが含まれている----入力テキストの所定の長さを得るためlength
、プログラムは、最小の長さを所望しましたatleast
。
でexcept
句、私たちは間違ったクラスに言及し、クラスが格納されas(为)
、対応するエラーまたは例外名の名前を。これは、関数呼び出しの引数に参加する形が似ています。この特にexcept
句我々は、例外オブジェクトを使用length
するatleast
ユーザのフィールドに適切なメッセージを表示します。
最後に5.お試しください...
あなたのドキュメントを読むために読んでいると仮定します。どのように関係なく、例外が発生するかどうかの、ファイルオブジェクトが正しく閉じていることを確認する必要がありますか?これがかもしれfinally
熟練ブロック。
プログラムを保存しますexceptions_finally.py
:
import sys
import time
f = None
try:
f = open("poem.txt")
# 我们常用的文件阅读风格
while True:
line = f.readline()
if len(line) == 0:
break
print(line, end='')
sys.stdout.flush()
print("Press ctrl+c now")
# 为了确保它能运行一段时间
time.sleep(2)
except IOError:
print("Could not find file poem.txt")
except KeyboardInterrupt:
print("!! You cancelled the reading from the file.")
finally:
if f:
f.close()
print("(Cleaning up: Closed the file)")
出力:
$ python exceptions_finally.py
Programming is fun
Press ctrl+c now
^C!! You cancelled the reading from the file.
(Cleaning up: Closed the file)
私たちは、通常のファイル操作を読んで、私たちはまた、使用してtime.sleep
任意の2秒の機能をプログラムが遅い実行されているように、睡眠中に印刷された各ラインの後に挿入されている(Pythonは通常の状況下では非常に迅速に実行されます)。プログラムはランオフの過程にある場合には、Enterキーを押してctrl + c
プログラムを中断または中止すること。
あなたは気づくでしょうKeyboardInterrupt
、そして、プログラムが終了し、例外がスローされます。しかし、プログラムが終了する前に、finally節が実装される、ファイルオブジェクトは常に閉じられています。
また、私たちがしていることに注目すべきでprint
使用した後sys.stout.flush()
、画面に即座に印刷することができるように、。
声明6.
ではtry
、リソースブロックを取得して、finally
リソースを解放するには、コモンモードブロックです。したがって、そこでwith
完了するクリーンな姿勢でこのプロセスを可能にした文は。
名前を付けて保存exceptions_using_with.py
:
with open("poem.txt") as f:
for line in f:
print(line, end='')
プログラム出力の内容は、発表の場合で同じである必要があります。我々が使用することを除いて、この実施例はあるopen
の機能with
声明-ファイルのクローズ操作が呼ばれるwith open
自動化すること。
舞台裏で何が起こるかありwith
声明(プロトコル)で使用されるプロトコルは。それはによって取得されるopen
「thefile」である。この場合には、目標return文。
それは、常にコードのブロックの開始前に呼び出されるthefile.__enter__
関数であり、呼び出しは、コードブロックを終了し、常に後thefile.__exit__
。
したがって、我々はfinally
特別な注目すべきであるコードのコードブロックを記述し__exit__
、自動化された方法を。これは、明示的に使用し、繰り返しを避けるために私たちを助けることができるtry..finally
文を。
このトピックのより多くの議論に関しては、本書の範囲が関与することができますを超えているので、参照してくださいPEP 343より十分に説明を理解すること。
概要
我々が議論しているtry..except
とtry..finally
、文の使用。また、当社独自の例外タイプを作成し、どのように例外をスローする方法を見てきました。
次に、我々は、Pythonの標準ライブラリを探求します。
リソース
[1] パイソンの異常・Aバイト