[Python 100 日習熟] Day17: Python プログラムの例外とデバッグ _ 一般的な例外の種類と解決策、例外処理ステートメント

https://blog.csdn.net/qq_35831906/category_12375510.html?spm=1001.2014.3001.5482

目次

コラムガイド

一般的な Python 例外の種類と解決策

2 つの一般的な例外処理ステートメント

1 回の試行...例外ステートメント 

2 try...excel...else ステートメント

3 try...excel...finally ステートメント

4 raise ステートメントを使用して例外をスローします

5 つのカスタム例外タイプ

6 例外連鎖処理


コラムガイド

        この記事は、コラム「100 日で Python に達する」に掲載されています。 このコラムは、初心者から上級者までを対象としており、Python プログラミング言語の核となる概念と実践的なスキルを素早く把握し、基本的な構文、データ型をマスターします。 、関数、モジュール、Python のオブジェクト指向プログラミングについて重要な知識を待ってから実際のプロジェクトの戦闘に深く入り込み、Python を使用して実践的な問題を解決してください。

  Pythonの魅力を探ってプログラミングの世界をマスターしましょう!さあ行こう!

コラム購読アドレス: https://blog.csdn.net/qq_35831906/category_12375510.html


            Python では、例外とは、プログラムの実行中に発生し、プログラムの正常な続行を妨げるエラーまたは予期しない状態のことです。Python には、さまざまな種類のエラーを表すための一連の組み込み例外クラスが用意されています。プログラム内で例外が発生した場合、これらの例外は例外処理メカニズムを通じて捕捉され、処理されるため、エラー状況を適切に処理できます。

一般的な Python 例外の種類と解決策

Python には、さまざまなエラーや例外条件を表すために使用される組み込みの例外タイプが多数あります。

Exception はすべての組み込み例外の基本クラスであり、Python のすべての例外クラスは Exception クラスを継承します。プログラム内で例外が発生すると、対応する例外オブジェクトがスローされ、これらの例外が処理されない場合、プログラムは実行を終了します。

Python での一般的な例外の種類と解決策: 

1.SyntaxError: 構文エラー。通常、タイプミスやコロンの欠落など、コード内の記述エラーが原因で発生します。

        解決策: コードを注意深くチェックして、構文が正しいことを確認してください。

2.IndentationError: インデント エラー。通常はコードのインデントが間違っていることが原因で発生します。

        解決策: コードのインデントが正しいかどうかを確認し、インデントとしてスペース 4 つを使用することをお勧めします。

3.NameError: 名前が正しくありません。通常、未定義の変数名または関数名を使用したことが原因で発生します。

        回避策: 変数名と関数名が正しく定義されているか、使用する前に確認してください。

4.TypeError: 型エラー。通常、間違ったデータ型を使用することによって発生します。

        解決策: データ型が一致しているかどうかを確認し、一致していない場合は、型変換を実行するか、正しいデータ型を使用してください。

5.ValueError: 値エラー。通常は不正な値を使用したことが原因で発生します。

        解決策: データの値の範囲が正しいかどうかを確認し、正当な値が使用されていることを確認します。

6.ZeroDivisionError: ゼロ除算エラー。通常、除算演算でのゼロ除算が原因で発生します。

        解決策: 除数がゼロではないことを確認してください。除数がゼロの場合は例外処理を実行して、プログラムのクラッシュを回避できます。

7.IndexError: インデックス エラー。通常、シーケンスの範囲を超えるインデックスを使用したことが原因で発生します。

        解決策: インデックス値がシーケンスの範囲内にあるかどうかを確認し、シーケンスの長さを超えていないことを確認します。

8.KeyError: キー エラー。通常、存在しないキーを使用したことが原因で発生します。

        回避策: キーが辞書に存在することを確認します。inキーワードを使用してキーが存在するかどうかを確認できます。

9.FileNotFoundError: ファイルが存在しないエラー。通常は、存在しないファイルを開こうとしたことが原因で発生します。

        解決策: ファイル パスが正しいかどうかを確認し、ファイルが存在することを確認します。

10.ImportError: インポート エラー。通常はモジュールまたはパッケージのインポートの問題が原因で発生します。

        解決策: モジュールまたはパッケージのパスが正しいかどうかを確認し、モジュールが存在することを確認します。

11. IOError (入出力エラー): この例外は、ファイルの入出力に関連する問題が発生した場合にスローされます。

        解決策: ファイルのアクセス許可が正しいことを確認し、ファイルの入出力に関連する他の問題がないか確認してください。

12.AttributeError (属性エラー): この例外は、存在しない属性またはメソッドを使用した場合にスローされます。

        解決策: プロパティまたはメソッドがオブジェクトに存在すること、またはプロパティにアクセスしたりメソッドを呼び出す前にオブジェクトが適切に初期化されていることを確認してください。

RuntimeError: 実行時エラー。別の例外タイプに分類できないため、通常は基本クラスとしてスローされます。

    

        例外を処理する一般的な方法は、try...exceptステートメントを使用することです。tryブロック内で例外をスローする可能性のあるコードを実行し、例外が発生した場合は、exceptそのブロックにジャンプして例外を処理します。例外をキャッチして処理することで、プログラムのクラッシュを回避し、プログラムの堅牢性と耐障害性を高めることができます。

2 つの一般的な例外処理ステートメント

Exception はすべての組み込み例外の基本クラスであり、Python のすべての例外クラスは Exception クラスを継承します。プログラム内で例外が発生すると、対応する例外オブジェクトがスローされ、これらの例外が処理されない場合、プログラムは実行を終了します。例外を解決するには、次のアプローチを取ることができます。

1 回の試行...例外ステートメント 

        例外をスローする可能性のあるコード ブロック内で try...Except ステートメントを使用して、例外をキャッチして処理します。例外をスローする可能性のあるコードを try ブロックに配置し、例外が発生した場合は、Exception ブロックで例外を処理します。

例 1: 特定の例外タイプをキャッチする

try:
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
    print("结果:", result)
except ValueError:
    print("请输入有效的整数值!")
except ZeroDivisionError:
    print("除数不能为零!")

上の例では、ユーザーが入力した文字列を整数に変換し、除算を実行しようとしています。ユーザーが有効な整数ではない値を入力すると、ValueError例外が発生し、適切なエラー メッセージが出力されます。除数がゼロの場合、ZeroDivisionError例外が発生し、適切なエラー メッセージが出力されます。

例 2: すべての例外をキャッチする

try:
    num = int(input("请输入一个整数: "))
    result = 10 / num
    print("结果:", result)
except Exception as e:
    print("发生了异常:", e)

 この例では、ユーザーが入力した文字列を整数に変換し、それを除算の約数として使用しようとします。どのようなタイプの例外が発生しても、except Exceptionステートメントは例外をキャッチして処理し、例外オブジェクトを変数に割り当てますe次に、例外メッセージを出力します。

例 3: 複数の例外タイプをキャッチする

try:
    file = open("nonexistent.txt", "r")
    content = file.read()
    file.close()
    print("文件内容:", content)
except FileNotFoundError:
    print("文件不存在!")
except PermissionError:
    print("没有文件访问权限!")
except Exception as e:
    print("发生了异常:", e)

上の例では、存在しないファイルを開いてその内容を読み取ろうとしています。ファイルが存在しない場合は例外が発生しFileNotFoundError、ファイルにアクセスするための権限が不十分な場合は例外が発生しますPermissionError複数のステートメントを使用してexcept、さまざまなタイプの例外をキャッチし、対応するエラー メッセージを出力します。他のタイプの例外が発生した場合、その例外はexcept Exceptionステートメントによって捕捉され、例外メッセージが出力されます。

2 try...excel...else ステートメント

        例外をキャッチするだけでなく、try...Except ステートメントに else ブロックを追加して、例外がない場合の状況を処理することもできます。

        これにより、例外をスローする可能性のあるコード ブロックの実行を試みることができ、例外が発生した場合は、exceptブロック内で例外的なケースを処理し、elseブロック内で通常の実行ケースを処理できます。

文法構造は次のとおりです。

try:
    # 可能引发异常的代码块
except ExceptionType:
    # 处理指定类型的异常
else:
    # 没有异常时执行的代码块

例 1:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("Error: Division by zero!")
    else:
        print(f"The result of {x} divided by {y} is {result}")

divide(10, 2)   # Output: The result of 10 divided by 2 is 5.0
divide(10, 0)   # Output: Error: Division by zero!

例2; 

try:
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
except ValueError:
    print("请输入有效的整数值!")
except ZeroDivisionError:
    print("除数不能为零!")
else:
    print("结果:", result)

この例では、ユーザーが入力した 2 つの整数を除算します。ユーザー入力が有効な整数でない場合はValueError例外がスローされ、除数がゼロの場合はZeroDivisionError例外がスローされます。例外が発生しない場合、else結果はブロックに出力されます。

exceptブロックかブロックかに関係なくelse、最大 1 つのブロックが実行されます。例外が発生した場合は、対応するexceptブロックが実行され、例外が発生しなかった場合は、elseそのブロックが実行されます。

もう 1 つ: try-excel-else ステートメントの例外ブロックはオプションです。try ブロックと else ブロックのみを使用することも、複数の例外ブロックを追加してさまざまな種類の例外をキャッチすることもできます。

3 try...excel...finally ステートメント

        Final ブロッ​​クは try...Except ステートメントに追加でき、例外が発生したかどうかに関係なく、finally ブロック内のコードが実行されます。これは、発生する可能性のある例外をキャッチして処理し、例外が発生したかどうかに関係なくコード ブロックを実行するために使用されます。

   tryブロックには例外をスローする可能性のあるコードが含まれており、exceptブロックは例外を処理するために使用され、finallyブロック内のコードは例外が発生するかどうかに関係なく常に実行されます。

以下に、try...except...finallyステートメントの詳細な説明と例を示します。

  1. tryブロック: 例外をスローする可能性のあるコードが含まれています。

  2. exceptブロック: 例外をキャッチして処理するために使用されます。tryブロック内で例外が発生すると、プログラムはtryブロックの残りのコードをスキップし、exceptブロック内のコードを実行します。これを使用しexceptて、その後に特定の例外タイプを使用して、特定のタイプの例外を処理することも、except例外タイプを指定せずに使用して、すべての例外を処理することもできます。

  3. finallyブロック: 例外が発生したかどうかに関係なく、含まれているコードは常に実行されます。例外が発生したかどうかに関係なく、finally例外が発生したときに必要なクリーンアップ作業が確実に実行されるように、ブロック内のコードが実行されます。

try...except...finallyこのステートメントの使用法を示す簡単な例を次に示します。

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不能为零!")
        result = None
    finally:
        print("执行finally块!")
    return result

# 调用函数
print(divide(10, 2))  # 输出: 5.0
print(divide(10, 0))  # 输出: 除数不能为零! 执行finally块! None

        上の例では、divide2 つの引数を受け取りxで除算をy試みる関数を定義しましたゼロの場合例外がトリガーされます。ブロック内で除算演算を実行しようとします。例外が発生すると、ブロック内のコードが実行されてエラー メッセージが表示されます。ブロック内のコードは、例外が発生するかどうかに関係なく実行されます。xyyZeroDivisionErrortryexceptfinally

注:finallyブロック内のコードはオプションであり、省略したり使用しないこともできます。try...except構造ではtryブロックは必須ですが、exceptブロックとfinallyブロックはオプションです。

4 raise ステートメントを使用して例外をスローします

        Python では、raiseステートメントを使用して手動で例外をスローできます。raiseステートメントを使用すると、コード内の特定のポイントで積極的に例外を発生させ、必要に応じてエラー処理を行うことができます。

  raiseステートメントの一般的な構文は次のとおりです。

raise [ExceptionType[(args)]]

         その中には、ExceptionType例外のタイプがあり、組み込みの例外タイプ ( など) またはカスタム例外タイプを指定できValueErrorますTypeErrorargsは、例外に関する追加情報を提供するオプションのパラメータです。

raiseステートメントを使用して例外をスローする例を        次に示します。

def divide(x, y):
    if y == 0:
        raise ValueError("除数不能为零!")
    return x / y

try:
    result = divide(10, 0)
    print(result)
except ValueError as e:
    print("发生异常:", e)

上の例では、と のdivide2 つのパラメーターを取る関数を定義しましたゼロの場合ステートメントを使用して、「除数をゼロにすることはできません!」というエラー メッセージを含む例外をスローします。ブロック内の関数を呼び出しブロック内でスローされた例外をキャッチして処理します。xyyraiseValueErrortrydivideexcept

出力結果:

发生异常: 除数不能为零!

ステートメントを使用するとraise、必要に応じて例外を積極的に発生させ、必要に応じて例外処理を実行できます。これにより、コードの可読性と堅牢性が向上し、エラー処理がより柔軟かつ正確になります。

5 つのカスタム例外タイプ

        特定の種類の例外を処理する必要がある場合は、例外クラスをカスタマイズし、必要に応じてその例外をスローできます。 

class MyError(Exception):
    def __init__(self, message):
        self.message = message

try:
    raise MyError("自定义异常")
except MyError as e:
    print("捕获自定义异常:", e.message)

6 例外連鎖処理

        例外を現在の場所で処理できない場合、例外は処理のために上位層の呼び出し関数に渡され、例外チェーンが形成されます。

def func():
    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        raise MyError("发生异常:") from e

try:
    func()
except MyError as e:
    print("捕获异常链:", e)

       

上記のこれらの方法は、例外の処理と解決、プログラムの安定性と信頼性の確保に役立ちます。ただし、例外処理は合理的に使用する必要があり、try...excel ステートメントの過度の使用を避ける必要があることに注意してください。例外処理は、コードを明確で読みやすい状態に保つために、特定の状況に応じて実行する必要があります。


Python プログラムの例外とデバッグ次:  【Python 100 日堪能】Day18: Python プログラムの例外とデバッグ_一般的なプログラムのデバッグ方法とスキル、デバッグコードと公式コードを分離する方法_LeapMay のブログ - CSDN ブログ

おすすめ

転載: blog.csdn.net/qq_35831906/article/details/131932128