05.例外処理

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属している必要がありますが、これKeyErrorLookupErrorサブクラスであり、その前に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ステートメントの存在に基づいている必要がありますステートメントなしexcepttryステートメントでステートメントを使用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))


   
   
   
   

おすすめ

転載: blog.csdn.net/sinat_39470268/article/details/107570526