Pythonクロックインの3日目の例外処理
異常とは、実行時に検出されたエラーです。コンピュータ言語は、起こり得るエラーの例外タイプを定義します。特定のエラーが対応する例外を引き起こすと、例外ハンドラが開始され、プログラムの通常の動作が復元されます。
1. Python標準の例外の概要
- BaseException:すべての異常な基本クラス
- 例外:従来の異常基本クラス
- StandardError:すべての組み込み標準例外の基本クラス
- ArithmeticError:すべての数値計算例外の基本クラス
- FloatingPointError:浮動小数点計算例外
- OverflowError:数値演算が上限を超えています
- ZeroDivisionError:ゼロによる除算
- AssertionError:アサーションステートメント(assert)が失敗しました
- AttributeError:不明なオブジェクト属性にアクセスしようとしました
- EOFError:組み込み入力なし、EOFマークに到達
- EnvironmentError:オペレーティングシステム例外の基本クラス
- IOError:入出力操作が失敗しました
- OSError:オペレーティングシステムによって生成された例外(たとえば、存在しないファイルを開く)
- WindowsError:システムコールに失敗しました
- ImportError:モジュールのインポートが失敗した場合
- KeyboardInterrupt:ユーザー割り込み実行
- LookupError:無効なデータクエリの基本クラス
- IndexError:インデックスがシーケンスの範囲外です
- KeyError:辞書に存在しないキーワードを検索します
- MemoryError:メモリオーバーフロー(オブジェクトを削除することでメモリを解放できます)
- NameError:存在しない変数にアクセスしようとしました
- UnboundLocalError:初期化されていないローカル変数へのアクセス
- ReferenceError:ガベージコレクションされたオブジェクトにアクセスするための弱い参照試行
- RuntimeError:一般的なランタイム例外
- NotImplementedError:メソッドはまだ実装されていません
- SyntaxError:構文エラーが原因の例外
- IndentationError:インデントエラーが原因の例外
- TabError:タブとスペースが混在しています
- SystemError:一般的なインタープリターシステム例外
- TypeError:異なるタイプ間の無効な操作
- ValueError:無効なパラメーターが渡されました
- UnicodeError:Unicode関連の例外
- UnicodeDecodeError:Unicodeデコード中の例外
- UnicodeEncodeError:Unicodeエンコーディングエラーが原因の例外
- UnicodeTranslateError:Unicode変換エラーが原因の例外
例外システムには階層関係があり、Python例外システムには次のような関係があります。
2. Python標準の警告の概要
- 警告:警告の基本クラス
- DeprecationWarning:廃止された機能に関する警告
- FutureWarning:構造のセマンティクスが将来変更されるという警告
- UserWarning:ユーザーコードによって生成された警告
- PendingDeprecationWarning:機能が廃止されるという警告
- RuntimeWarning:疑わしいランタイム動作(ランタイム動作)の警告
- SyntaxWarning:不審な構文警告
- ImportWarning:モジュールのインポート中に警告をトリガーするために使用されます
- UnicodeWarning:Unicodeに関連する警告
- BytesWarning:バイトまたはバイトコードに関連する警告
- ResourceWarning:リソースの使用に関する警告
3. try-exceptステートメント
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
tryステートメントは次のように機能します。
- まず、
try
句を実行します(キーワードtry
とキーワードのexcept
間のステートメント) - 例外が発生しない場合、
except
句は無視され、句はtry
実行後に終了します。 try
句の実行中に例外が発生した場合、try
残りの句は無視されます。例外のタイプがexcept
その後の名前と一致する場合、対応するexcept
句が実行されます。最後に実行されたtry
ステートメントの後のコード。- 例外がいずれ
except
にも一致しない場合、例外は上位層に渡されtry
ます。
【例】
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError:
print('打开文件出错')
# 打开文件出错
【例】
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError as error:
print('打开文件出错\n原因是:' + str(error))
# 打开文件出错
# 原因是:[Errno 2] No such file or directory: 'test.txt'
try
ステートメントが複数含まれていてもよいexcept
異なる特定の例外を処理するための句を。最大で1つのブランチのみが実行されます。
【例】
try:
int("abc")
s = 1 + '1'
f = open('test.txt')
print(f.read())
f.close()
except OSError as error:
print('打开文件出错\n原因是:' + str(error))
except TypeError as error:
print('类型出错\n原因是:' + str(error))
except ValueError as error:
print('数值出错\n原因是:' + str(error))
# 数值出错
# 原因是:invalid literal for int() with base 10: 'abc'
【例】
dict1 = {
'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except LookupError:
print('查询错误')
except KeyError:
print('键错误')
else:
print(x)
# 查询错误
try-except-else
このステートメントdict
は、存在しないキーと値のペアをクエリしようとしたため、例外が発生しました。この例外は正確にKeyError
に属している必要がありますが、これKeyError
はLookupError
サブクラスであり、その前にLookupError
配置さKeyError
れるため、プログラムはexcept
最初にコードブロックを実行します。したがって、複数のexcept
コードブロックを使用する場合は、最も対象を絞った例外から最も一般的な例外まで、仕様の順序に従う必要があります。
【例】
dict1 = {
'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except KeyError:
print('键错误')
except LookupError:
print('查询错误')
else:
print(x)
# 键错误
【例】except
句は、タプルとして括弧内に配置される複数の例外を処理できます。
try:
s = 1 + '1'
int("abc")
f = open('test.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as error:
print('出错了!\n原因是:' + str(error))
# 出错了!
# 原因是:unsupported operand type(s) for +: 'int' and 'str'
4. try-except-finallyステートメント
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally:
无论如何都会被执行的代码
句try
で例外が発生したかどうかに関係なく、finally
句が実行されます。
インターセプトtry
なしで句で例外がスローされた場合、その句の実行後にexcept
例外がfinally
スローされます。
【例】
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
divide(2, 1)
# result is 2.0
# executing finally clause
divide(2, 0)
# division by zero!
# executing finally clause
divide("2", "1")
# executing finally clause
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
5. try-except-elseステートメント
try
句の実行中に例外が発生しない場合、Pythonはelse
ステートメントの次のステートメントを実行します。
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
except
例外タイプなしで使用するのは良い方法ではありません。すべての例外をキャッチするため、このプログラムでは特定の例外情報を特定できません。
try:
检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
发生以上多个异常中的一个,执行这块代码
else:
如果没有异常执行这块代码
【例】
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
fh.close()
# 内容写入文件成功
注:ステートメントelse
の存在は、except
ステートメントの存在に基づいている必要があります。ステートメントなしexcept
のtry
ステートメントでステートメントを使用else
すると、文法エラーが発生します。
6.レイズステートメント
Pythonはraise
ステートメントを使用して、指定された例外をスローします。
【例】
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
# An exception flew by!
練習問題:
1.数字のゲームを当てよう
タイトル説明:
コンピューターは0から100までの乱数を生成し、ユーザーに推測を求めます。ユーザーが推測した数がこの数より大きい場合、プロンプトは大きすぎます。そうでない場合、プロンプトは小さすぎます。ユーザーがコンピューターを推測した場合、コンピューターは「おめでとうございます!番号は...」ユーザーが毎回推測する前に、プログラムはユーザーの最初の推測を出力します。ユーザー入力がまったく数値でない場合、プログラムはユーザーに「入力が無効です」と通知します。
(入力状況を処理するためにtry catch例外処理構造を使用してみてください)
randomモジュールは、乱数を取得するために使用されます。
# your code here
import random
ran_num = random.randint(0, 100)
print("请输入一个0到100之间的整数")
i=0
while True:
try:
i+=1
print("这是第"+str(i)+"次猜测")
guess=input("请猜测一个数字:")
guess_num=int(guess)
if guess_num > ran_num :
print("太大")
elif guess_num < ran_num :
print("太小")
else :
print("恭喜你猜到了这个数是"+str(guess_num))
break
except ValueError as error:
print("输入无效\n"+str(error))