PHPの例外を使用した修正作業

前回の記事で、すべての「エラーメカニズム」を例外に減らすことを提案しました。そのため、PHPで例外を正しく処理する方法を説明するのは理にかなっています。

最初に、エラーを処理するメカニズムとして例外を選択した理由を説明します。

  1. 例外は、柔軟で拡張可能なエラー処理方法です。
  2. これは標準化されたメカニズムです。コードを使用したことがない人でも、エラーを処理する方法を理解するためにマニュアルを読む必要はありません。 彼は例外がどのように機能するかを知るだけで十分です。
  3. 例外を除き、コールスタック(トレース)が常に存在するため、エラーの原因を見つけやすくなります。


私はこの記事でアメリカを発見していないとすぐに言わなければなりません。 例外を処理するための標準的な原則と、PHPによって課される機能の一部が説明されています。 経験豊富な開発者は自分で何か新しいものを見つけるかもしれませんが、初心者のために読むと便利です。



1.抽象例外 (つまり、単なる例外)をスローしないでください 。 アプリケーション(モジュール、ライブラリ)専用の少なくとも1つの例外クラスを宣言します

class baseException extends Exception { }


コード内のすべての行を置き換えます

新しい例外をスロー ;




新しい baseException )をスローします。


したがって、コードの例外はすべて、コードの例外と区別できます。





2.例外は階層的でなければなりません 。 コードでスローされたすべての例外が継承されるベース例外クラスが必要です。 たとえば、fileModuleファイルを操作するためのコードにモジュールがある場合、このモジュールによってのみスローされる例外を宣言します

クラス fileModuleException baseException { }を 拡張します


たとえば、ファイルの操作に関連するすべてのエラーの中で、エラーをさらに区別する必要がある場合、ファイルが見つからない状況を区別したい場合は、もう1つの例外を宣言する必要があります

クラス fileNotFoundException fileModuleException { }を 拡張します



階層を観察すると、アプリケーション内のさまざまなモジュールから例外を区別できます。 各モジュールに多数の例外を要求しません。 例外は、コードからではなく、特別な方法で処理したい状況から設計する必要があります。

逆の状況では、状況が必要な場合、さまざまな例外を軽視しないでください

{

// ...

} catch fileModuleException $ e {

switch $ e- > getCode { //これを行う必要はありません

ケース 1 echo 'file not found' ;

ケース 2 echo 'file not readable' ;

// ...

}

}



そのような状況が原則的に不可能になるように、基本クラスのコードを「消す」ことができます

function __construct $ message = '' $ code = 0 {

:: __construct $ message 0 ;

}




3.このコンテキストでの処理方法が明確でない場合は、例外を処理しないでください 。 たとえば、MVCパターンに従う場合、モデルメソッドでは、エラーの処理方法(エラーの表示方法)が明確でない場合があります。これは、コントロールがロジックを担当し、ビューが出力を担当するためです。 例外の処理方法が明確でない場合は、さらに「転送」してください。

{

$ db- > begin ;

// ...

$ db- > commit ;

} catch 例外$ e {

$ db- > rollback ;

$ eを投げます。

}


例外は、例外をスローするメソッドから予期できます。 例外を変換することにより、メソッドによってスローされる例外の数を絞り込むことができます。

{

// ...

} catch 例外$ e {

新しい baseException $ message 0 $ e )を投げます。 //チェーンを壊しません

}


これは非常に重要なポイントです-例外の連鎖を壊さないでください。 3番目のパラメーターは、初期例外を渡します。 このコードは5.3でネイティブに機能し、5.2では改良されています。 このアプローチでは、例外の最初のスローから呼び出しスタックは「積分」されます。



4.グローバル例外ハンドラーが必要です。 try ... catchの最高レベルまたはExceptionHandlerのいずれかです。 グローバルハンドラーに到達するすべての例外は、以前は正しく処理されなかったため、重要と見なされます。 それらは保護されなければなりません。



5.例外はオブジェクトであるため、ニーズに合わせて拡張できます 。 多言語アプリケーションがあり、スローする例外のエラーテキストをユーザーに表示する必要があるとします。 したがって、このメッセージは翻訳する必要があります。 「操作中のエラー」など、メッセージに可変部分がない場合は難しくありません。 しかし、メッセージに可変部分が含まれている場合、たとえば、「貸借対照表に十分なお金がありません(1000)。 2000が必要です。」 次に、エラーテキストテンプレートと変数自体を個別に渡すことができます。 サンプルコード 古いコード例





6.すべてのアサーションの失敗および致命的でないエラーを例外に変換します以前の記事を参照



7.処理せずに例外をジャムしない

{

// ...

} catch 例外$ e {

//何もしません

}



そうでなければ、そのようなアクションのためにエラーを見つけることは非常に難しいでしょう。 少なくともログインする必要があります:

{

// ...

} catch 例外$ e {

exceptionHandlerClass :: exceptionLog $ e ;

}




8.例外を文書化します。 メソッドがスローする例外をdocblockに示します(@throwsタグ、複数指定できます)。 それは誰にとっても生活を楽にします。



基本的に、例外について知る必要があるのはこれだけです。 最後に、別の興味深い事実-インターフェースで例外をキャッチできます:

インターフェース iException { }

クラス customException baseExceptionを拡張し、 iException { }を実装します

{

// ...

} catch iException $ e {

// ...

}




UPDはコメント内のコメントを修正しました: 1、2 、および3 (ディスカッションに参加したすべての人に感謝します)。

積極的に参加してくれたhabrayuzer ckopobapkuhに感謝



All Articles