例外を正しく使用する方法

例外の概念の研究が、あなたの言語の公式文書の対応するセクションを読むことで終わる場合は残念です。



try {...} catch(Exception $ e){...}コンストラクトの構文を調べ、独自の例外クラスを作成する機能について学習し、Exceptionクラスからそれらを継承し、メカニズムの力を表面的に理解したら、一度に1つずつ実行できます次の2つの方法があります。





1.プログラムの例外と通常のエラーを明確に区別できるようにする必要があります。たとえば、間違ったユーザー名またはパスワードは例外ではありません。 これはプログラムではなくユーザーエラーであり、 非常に頻繁に発生する可能性があります。 一方、データベースサーバーへのアクセス不能によるmysql_connect()関数の失敗は例外的な状況であり、例外をスローする必要があります! これについては後で詳しく説明します。



2.クラスメソッドは、同じクラスの他のメソッドによってスローされた例外をキャッチするべきではありません 。 ライブラリは、そのメソッドが例外的な状況になった場合に何をすべきかについてまったく知らないはずです。使用されるシステムによっては、この動作が大きく異なる可能性があるためです。 彼女の仕事は例外を投げることです。 たとえば、クラス全体の正しい操作に必要なファイルが存在しない場合、これを処理しないでください。 これは、アプリケーションのより高いレベルの問題です。



一方、(必要に応じて)下位レベルでスローされた例外を非常にうまくキャッチできます。 不要な場合は、スタックに沿って最も近いcatch {}に渡されます(より正確には、最も近いtry {}に対応する{}キャッチし ます )。 connect()query()などのメソッドを使用して、データベースを操作するためのラッパークラスがあるとします。 もちろん、サーバーに接続できない場合は、 connect()メソッドで例外をスローする必要があります。



ただし、 connect()メソッド自体も、 connect()を自動的に呼び出すクエリ()メソッドも、インターセプトしないでください。 この例外は、このクラスのメソッドで動作するより高いレベルでキャッチする必要があり、そこで決定する必要があります-別のサーバーに接続する、異なるタイプのデータソースを使用する、エラーを表示する、または例外をさらに高く渡す(異なるシステムで)さまざまな方法で、彼らに何をすべきかを決定させます)。 アイデアが明確であることを願っています。



3.大規模なアプリケーションでは、独自の例外クラス(組み込みのExceptionから継承)を使用する必要があります。 これにより、エラークラスの階層を構築し、重要度、タイプなどで分類できます。 クラスApplication_Exceptionがあるとしましょう:



class Application_Exception extends Exception{...}

:








class Logic_Exception extends Application_Exception{...}

-- , , .








class Data_Access_Exception extends Application_Exception{...}

-- , , , - .








class Security_Exception extends Application_Exception{...}

-- , , ;)








これらのタイプのエラーはすべて異なる方法で処理する必要があります。たとえば、インターネット全体のセキュリティエラーについて叫ぶべきではありませんが、データベースサーバーに障害が発生した場合は、おplateび付きのインテリジェントプレートを表示できます(一般的に、味と色について)。



4.エラー情報の最大量については、組み込みの例外クラスの機能を使用してください。車輪を再発明しないでください! ファイル名と例外がスローされた行で十分でない場合は、 getTrace()およびgetPrevious()メソッドを自由に使用できます。これにより、前に起こったことの全体像が確実にレイアウトされます(詳細については、ドキュメントを参照してください)。



このメモでは、例外を使用するときに最も重要だと考える主要な理論的ポイントを概説しようとしました。 元のエントリは私のブログにあります。

頑張って!



All Articles