ホームページ >バックエンド開発 >Python チュートリアル >Pythonでのプロフェッショナルエラー処理

Pythonでのプロフェッショナルエラー処理

Jennifer Aniston
Jennifer Anistonオリジナル
2025-03-04 10:58:19374ブラウズ

このチュートリアルでは、システム全体の観点からPythonのエラー条件を処理する方法を学びます。エラー処理は設計の重要な側面であり、エンドユーザーまでずっと(ハードウェア)が最も低いレベル(場合によってはハードウェア)を超えます。一貫した戦略が整っていない場合、システムは信頼できず、ユーザーエクスペリエンスが低下し、デバッグとトラブルシューティングの多くの課題があります。モデル:ステータスコードと例外。ステータスコードは、任意のプログラミング言語で使用できます。例外には、言語/ランタイムサポートが必要です。

Pythonは例外をサポートします。 Pythonとその標準的なライブラリは、IOエラーなどの多くの例外的な状況を報告し、ゼロで分割し、境界のないインデックスを付けて、また繰り返しの終わりなどの例外的ではない状況(隠されていますが)などの多くの例外を報告するために、自由に例外を使用しています。ほとんどのライブラリは訴訟に続き、例外を提起します。

それは、コードがとにかくPythonとライブラリによって提起された例外を処理する必要があることを意味します。そのため、必要に応じてコードから例外を提起し、ステータスコードに依存しません。アクション:

try

句を呼び出すときの出力は次のとおりです。例外が発生しない場合、プログラムは

句を除いてスキップします。 

整数を入力すると、プログラムは予想どおりに機能します。ただし、フロートまたは文字列を入力すると、プログラムは実行を停止します。

例外をキャッチすると、3つのオプションがあります。オリジナル。

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>

例外を飲み込むそれを処理する方法を知っていて完全に回復できる場合は、例外を飲み込む必要があります。たとえば、異なる形式(json、yaml)である可能性のある入力ファイルを受け取った場合、異なるパーサーを使用して解析することを試みることができます。 JSONパーサーがファイルが有効なJSONファイルではないという例外を提起した場合、それを飲み込んでYAMLパーサーで試してみます。 YAMLパーサーも失敗した場合、例外を伝播させます。これは、JSONエンコードの問題のためにJSONの解析が失敗した場合にのみYAML解析を試みたいこの場合の良いポリシーです。たとえば、

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>

as eを追加することにより、例外オブジェクトを除外で使用可能な名前にバインドすることに注意してください。e

同じ例外を再度上げて、例外を再度上げて、ハンドラー内に引数なしで

>を追加するだけです。これにより、ローカルハンドリングを実行できますが、それでも上位レベルも処理できます。ここでは、関数はコンソールの例外のタイプを印刷し、例外を再度提起します。複数の異なる低レベルの例外を、高レベルのコードによって均一に処理される単一のカテゴリにグループ化する場合があります。順番では、例外をユーザーレベルに変換し、アプリケーション固有のコンテキストを提供する必要があります。

最後に、句raiseinvoke_function()

Please enter a number: 10.3<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: hello<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: 10.0<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: <br>
例外がどこかに提起されていても、クリーンアップコードが実行されるようにすることがあります。たとえば、完了したら閉じたいデータベース接続がある場合があります。それを行うための間違った方法は次のとおりです。

関数が例外を提起する場合、

の呼び出しは実行されず、DB接続が開いたままになります。すべての例外ハンドラーが実行された後、

句は常に実行されます。正しく行う方法は次のとおりです。

import json<br>import yaml<br><br>def parse_file(filename):<br>    try:<br>        return json.load(open(filename))<br>    except json.JSONDecodeError<br>        return yaml.load(open(filename))<br>

への呼び出しは、接続を返したり、例外自体を引き上げたりすることはありません。この場合、db接続を閉じる必要はありません。query()close_db_connection()finally

は、元の例外をマスクするため、例外を提起しないように注意する必要があります。 finallyブロックの代わりに、
def print_exception_type(func, *args, **kwargs):<br>    try:<br>        return func(*args, **kwargs)<br>    except Exception as e:<br>        print(type(e))<br>
ステートメントを使用します。ファイルの例は次のとおりです。

open_db_connection()

今では、例外を掲載したとしても、例外が処理されたかどうかにかかわらず、

finallyブロックのスコープが終了するとすぐにファイルが適切に閉じられます。すべての例外を一般的な方法で扱うことができるWebアプリケーションで特に役立ちます。例外をログに記録し、発信者にエラーメッセージを返すだけです。

ロギングすると、例外タイプ、エラーメッセージ、およびスタックトレースをログに記録すると便利です。このすべての情報は

オブジェクトを介して利用できますが、例外ハンドラーで

メソッドを使用する場合、Pythonロギングシステムは関連するすべての情報を抽出します。これは私がお勧めするベストプラクティスです:

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>
このパターンに従う場合(ログインしていると仮定すると)何が起こったとしても、問題が発生したことのログにかなり良いレコードがあります。それは無駄であり、実際に単一のインスタンスが複数回ログに記録されたときに、あなたを混乱させ、同じ問題の複数のインスタンスが発生したと思わせるかもしれません。アプリケーション/システム。最も一般的な実装は、ログファイルを使用することです。しかし、数百、数千以上のサーバーを備えた大規模な分散システムの場合、これが必ずしも最良のソリューションではありません。

インフラストラクチャ全体の例外を追跡するために、セントリーのようなサービスは非常に役立ちます。すべての例外レポートを集中化し、スタックトレースに加えて、各スタックフレームの状態(例外が発生した時点での変数の値)を追加します。また、ダッシュボード、レポート、および複数のプロジェクトでメッセージを分解する方法を備えた非常に優れたインターフェイスも提供します。オープンソースであるため、独自のサーバーを実行したり、ホストされたバージョンに購読したりできます。

以下は、SentryがPythonアプリケーションのエラーをどのように紹介するかを示すスクリーンショットです。トラブルの最初の兆候でびっくりするシステムはあまり役に立ちません。

コードが応答していないリモートシステムにアクセスしている場合、従来のソリューションはタイムアウトですが、すべてのシステムがタイムアウトで設計されているわけではありません。タイムアウトは、条件が変化するにつれてキャリブレーションが容易ではありません。

別のアプローチは、速く失敗してから再試行することです。利点は、ターゲットが速く応答している場合、睡眠状態に多くの時間を費やす必要がなく、すぐに反応することができることです。しかし、失敗した場合は、実際に到達できないと判断し、例外を提起するまで複数回再試行することができます。次のセクションでは、あなたのためにそれを行うことができるデコレーターを紹介します。

有用なデコレーター装飾器を紹介します。

エラーlogger

ここに簡単な実装があります。デコレーターは、ロガーオブジェクトを除きます。関数を装飾し、関数が呼び出されると、コールがトライエクストセプト句に巻き付けられ、例外がある場合、それを記録して例外を再び提起します。デコレータ。

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>

結論

Please enter a number: 10.3<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: hello<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: 10.0<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: <br>
エラー処理は、ユーザーと開発者の両方にとって重要です。 Pythonは、例外ベースのエラー処理のために言語と標準ライブラリで優れたサポートを提供します。ベストプラクティスを熱心に追跡することで、しばしば無視される側面を征服することができます。エステルは、envato tutsのソフトウェア開発者兼ライターです。

以上がPythonでのプロフェッショナルエラー処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。