これまでセット 1 から 4 まで基本的な Python を学習してきました ( セット1 | セット2 | セット3 | セット4 )。
この記事では、適切な例を使用しながら、try、excel、finally ステートメントを使用して Python で例外を処理する方法について説明します。
Python のエラーには 2 つのタイプがあります。 構文エラーと例外 。エラーとは、プログラムの実行が停止される原因となるプログラム内の問題です。一方、プログラムの通常のフローを変更する内部イベントが発生すると、例外が発生します。
Python のさまざまな種類の例外:
Python には、プログラムの実行中にエラーが発生したときに発生する可能性のある組み込みの Python 例外がいくつかあります。 Python で最も一般的なタイプの例外をいくつか示します。
- 構文エラー: この例外は、キーワードのスペルミス、コロンの欠落、括弧のバランスが崩れているなど、インタープリタがコード内で構文エラーを検出した場合に発生します。
- タイプエラー : この例外は、整数に文字列を追加するなど、操作または関数が間違った型のオブジェクトに適用された場合に発生します。
- 名前エラー : この例外は、変数名または関数名が現在のスコープ内に見つからない場合に発生します。
- インデックスエラー : この例外は、インデックスがリスト、タプル、またはその他のシーケンス タイプの範囲外にある場合に発生します。
- キーエラー : この例外は、キーが辞書内に見つからない場合に発生します。
- 値エラー : この例外は、文字列が有効な整数を表していないときに文字列を整数に変換しようとした場合など、関数またはメソッドが無効な引数または入力で呼び出された場合に発生します。
- 属性エラー : この例外は、クラス インスタンスの存在しない属性にアクセスしようとした場合など、オブジェクトで属性またはメソッドが見つからない場合に発生します。
- IOエラー : この例外は、ファイルの読み取りまたは書き込みなどの I/O 操作が入出力エラーにより失敗した場合に発生します。
- ゼロディビジョンエラー : この例外は、数値をゼロで除算しようとすると発生します。
- インポートエラー : この例外は、インポート ステートメントがモジュールの検索またはロードに失敗した場合に発生します。
これらは、Python で発生する可能性のあるさまざまな種類の例外のほんの一例です。エラーを適切に処理し、プログラムのクラッシュを防ぐためには、try-excel ブロックやその他のエラー処理手法を使用して、コード内で例外を適切に処理することが重要です。
構文エラーと例外の違い
構文エラー: 名前が示すように、このエラーはコード内の間違った構文によって発生します。プログラムの終了につながります。
例:
コードに構文エラーがあります。の ' if'> ステートメントの後にはコロン (:>)、 そしてその ' print'> ステートメントは内側に収まるようにインデントする必要があります。 ' if'> ブロック。
Python3
amount>=> 10000> if>(amount>>>2999>)> print>(>'You are eligible to purchase Dsa Self Paced'>)> |
>
>
出力:

例外: プログラムの構文は正しいが、コードがエラーになる場合、例外が発生します。このエラーはプログラムの実行を停止しませんが、プログラムの通常のフローを変更します。
例:
このコードでは、 a を分割しています。 「マーク」 ゼロで知られるエラーが発生します。 「ゼロディビジョンエラー」
Python3
marks>=> 10000> a>=> marks>/> 0> print>(a)> |
>
>
文字列の日付を変換する
出力:

上記の例では、数値を 0 で除算しようとしているため、ZeroDivisionError が発生しました。
注記: Exception は、Python のすべての例外の基本クラスです。例外階層を確認できます ここ 。
例:
1) TypeError: この例外は、操作または関数が間違った型のオブジェクトに適用された場合に発生します。以下に例を示します。
ここで 'タイプエラー' 追加される両方のデータ型が異なるため、このエラーが発生します。
Python3
x>=> 5> y>=> 'hello'> z>=> x>+> y> |
>
>
output: Traceback (most recent call last): File '7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py', line 4, in z = x + y TypeError: unsupported operand type(s) for +: 'int' and 'str'>
それを解決するには、catch ブロックを試してください。
コードは整数を追加しようとします ( ' x'> ) と文字列 ( ' y'> ) を一緒にすると、これは有効な操作ではなく、 ' TypeError'> 。コードで使用したのは、 ' try'> そして ' except'> ブロックを使用してこの例外をキャッチし、エラー メッセージを出力します。
Python3
x>=> 5> y>=> 'hello'> try>:> >z>=> x>+> y> except> TypeError:> >print>(>'Error: cannot add an int and a str'>)> |
>
>出力
Error: cannot add an int and a str>
Try and Except ステートメント – 例外のキャッチ
Try ステートメントとExcept ステートメントは、Python で例外をキャッチして処理するために使用されます。例外を発生させる可能性のあるステートメントは try 句内に保持され、例外を処理するステートメントは else 句内に記述されます。
例: ここでは、インデックスが範囲外である配列要素にアクセスし、対応する例外を処理しようとしています。
Python3
a>=> [>1>,>2>,>3>]> try>:> >print> (>'Second element = %d'> %>(a[>1>]))> >print> (>'Fourth element = %d'> %>(a[>3>]))> except>:> >print> (>'An error occurred'>)> |
>
>出力
Second element = 2 An error occurred>
上記の例では、エラーの原因となる可能性のあるステートメントが try ステートメント (この場合は 2 番目の print ステートメント) 内に配置されています。 2 番目の print ステートメントは、存在しないリストの 4 番目の要素にアクセスしようとします。これにより例外がスローされます。この例外は、Except ステートメントによってキャッチされます。
特定の例外をキャッチする
try ステートメントには、さまざまな例外のハンドラーを指定するために、複数の else 句を含めることができます。最大 1 つのハンドラーが実行されることに注意してください。たとえば、上記のコードに IndexError を追加できます。特定の例外を追加するための一般的な構文は次のとおりです。
try: # statement(s) except IndexError: # statement(s) except ValueError: # statement(s)>
例: Python での特定の例外のキャッチ
ソートされたJava配列
コードは関数を定義します ' fun(a)'> それは計算しますb>入力に基づいてa>。もしa>が 4 未満の場合、ゼロによる除算が試行され、 ' ZeroDivisionError'> 。コード呼び出しfun(3)>そしてfun(5)>Try-Except ブロック内。それは、ZeroDivisionError>のためにfun(3)>そしてプリント ZeroDivisionError が発生し、処理されました。 の ' NameError'> ブロックは存在しないため実行されません。 ' NameError'> コード内の例外。
Python3
def> fun(a):> >if> a <>4>:> >b>=> a>/>(a>->3>)> >print>(>'Value of b = '>, b)> > try>:> >fun(>3>)> >fun(>5>)> except> ZeroDivisionError:> >print>(>'ZeroDivisionError Occurred and Handled'>)> except> NameError:> >print>(>'NameError Occurred and Handled'>)> |
>
>出力
ZeroDivisionError Occurred and Handled>
fun(3) 行にコメントを付けると、出力は次のようになります。
NameError Occurred and Handled>
上記の出力は、Python が b の値にアクセスしようとするとすぐに NameError が発生するため、このような出力になります。
Else 句を試してみる
Python では、try-excel ブロックで else 句を使用することもできます。この句は、すべての例外句の後に存在する必要があります。 Try 句によって例外が発生しない場合にのみ、コードは else ブロックに入ります。
else 句を試してみる
コードは関数を定義します AbyB(a, b)> それは計算しますc>((a+b) / (a-b)) として、ポテンシャルを処理します。ZeroDivisionError>。ゼロ除算エラーがない場合は結果を出力します。電話をかける AbyB(2.0, 3.0)> 計算して出力します-5.0>、電話をかけながら AbyB(3.0, 3.0)> ゼロで除算しようとすると、 ZeroDivisionError> 、捕らえられ、 a/b の結果は 0 と印刷されています。
角のある素材
Python3
def> AbyB(a , b):> >try>:> >c>=> ((a>+>b)>/> (a>->b))> >except> ZeroDivisionError:> >print> (>'a/b result in 0'>)> >else>:> >print> (c)> AbyB(>2.0>,>3.0>)> AbyB(>3.0>,>3.0>)> |
>
>
出力:
-5.0 a/b result in 0>
最後にPythonのキーワード
Python はキーワードを提供します ついに これは常に try ブロックとExcept ブロックの後に実行されます。最後のブロックは常に、try ブロックが正常に終了した後、または何らかの例外により try ブロックが終了した後に実行されます。
構文:
try: # Some Code.... except: # optional block # Handling of exception (if required) else: # execute if no exception finally: # Some code .....(always executed)>
例:
コードは整数のゼロ除算を実行しようとします。その結果、 ZeroDivisionError> 。例外をキャッチして出力します ゼロで割ることはできません。 例外に関係なく、finally>ブロックが実行されて出力される これは常に実行されます。
Python3
try>:> >k>=> 5>/>/>0> >print>(k)> except> ZeroDivisionError:> >print>(>'Can't divide by zero'>)> finally>:> >print>(>'This is always executed'>)> |
>
>
出力:
Can't divide by zero This is always executed>
例外の発生
の ステートメントを上げる プログラマが特定の例外を強制的に発生させることができます。 raise の唯一の引数は、発生する例外を示します。これは、例外インスタンスまたは例外クラス (Exception から派生したクラス) のいずれかである必要があります。
このコードは意図的にNameError>メッセージと一緒に やあ を使用してraise>内のステートメントtry>ブロック。次に、それをキャッチします。NameError>例外、印刷物 例外、 そして、次を使用して同じ例外を再発生させますraise>。これは、Python で例外を発生させて処理する方法を示し、カスタム エラー メッセージとさらなる例外の伝播を可能にします。
Python3
try>:> >raise> NameError(>'Hi there'>)> except> NameError:> >print> (>'An exception'>)> >raise> |
>
>
上記のコードの出力は単純に例外として行出力されますが、最後の行の raise ステートメントによりランタイム エラーも発生します。したがって、コマンドラインの出力は次のようになります。
Traceback (most recent call last): File '/home/d6ec14ca595b97bff8d8034bbf212a9f.py', line 5, in raise NameError('Hi there') # Raise Error NameError: Hi there> 例外処理の利点:
- プログラムの信頼性の向上 : 例外を適切に処理することで、予期しないエラーや入力によってプログラムがクラッシュしたり、誤った結果が生成されたりするのを防ぐことができます。
- 簡素化されたエラー処理 : 例外処理を使用すると、エラー処理コードをメイン プログラム ロジックから分離できるため、コードの読み取りと保守が容易になります。
- クリーナーコード: 例外処理を使用すると、エラーをチェックするために複雑な条件ステートメントを使用する必要がなくなり、コードがよりクリーンで読みやすくなります。
- デバッグが容易になる : 例外が発生すると、Python インタープリターは例外が発生した正確な位置を示すトレースバックを出力するため、コードのデバッグが容易になります。
例外処理の欠点:
- パフォーマンスのオーバーヘッド: インタプリタは例外をキャッチして処理するために追加の作業を実行する必要があるため、例外処理は条件付きステートメントを使用してエラーをチェックするよりも遅くなる可能性があります。
- コードの複雑さの増加 : 例外処理により、特に複数の種類の例外を処理する必要がある場合、または複雑なエラー処理ロジックを実装する必要がある場合、コードがより複雑になる可能性があります。
- 考えられるセキュリティリスク: 例外が不適切に処理されると、機密情報が漏洩したり、コードにセキュリティ上の脆弱性が生じたりする可能性があるため、例外を慎重に処理し、プログラムに関する情報が過度に公開されないようにすることが重要です。
全体として、Python の例外処理の利点は欠点を上回りますが、コードの品質とプログラムの信頼性を維持するには、賢明かつ慎重に例外処理を使用することが重要です。
この記事は Nikhil Kumar Singh(nickzuck_007) によって寄稿されました。