例外処理メカニズムについて前述したように、デバッグがオンになっている場合は、例外をカスタマイズすることが最善です。デバッグがオフになっている場合は、例外が表示されます。このレッスンでは、主に例外処理のメカニズムについて説明します。
次に、Toper の Tp_Exception という例外基本クラスを定義します。ここでは単に BaseException と呼びます。次に、BaseException.php には最初にシェルフが必要です。
1
1 |
3 | public function printStack() { |
2
4 |
5 | } |
6 | public function __toString() { |
7 |
8 | } |
9 | } |
最も基本的なことは、このクラスは Exception から継承する必要があり、次に __toString メソッドと別のカスタム printStack メソッドを実装する必要があるということです。__toString メソッドを実装する理由は、new Exception( を直接スローすることが多いためです。 ) この方法で例外がスローされた場合は、__toString()メソッドを直接呼び出し、printStackメソッドを呼び出すことでスタック情報が出力されます。
まず、どちらの方法でも、デバッグ モードであるかどうかを判断する必要があります。デバッグ モードである場合は、直接出力するだけです。エラー ページに移動しますが、ジャンプする前に、例外情報をログ ファイルに書き込む必要があります。
__toString であっても printStack であっても、デバッグがオフになっている場合はデバッグ情報をログ ファイルに記録する必要があることに気づいたかもしれません。そのため、最初に補助関数を記述する必要があります:
<テーブル>
1 | protected function _toLogFile($str) { |
2 | file_put_contents(APP_PATH . '/log',$str,FILE_APPEND); |
保護された関数 _toLogFile($str) {
3 | } |
2
<テーブル>
}
テーブル>
3
1
protected function _outputErrorPage() {
2 | header("content-type:text/html"); |
3 | echo file_get_contents(APP_PATH . '/error.html'); |
4 | } |
コードはシンプルにする必要があるため、エラー ページとログ ファイルはプロジェクトのルート ディレクトリに直接書き込まれます。興味がある場合は、設定ファイルにパスを書き込んでみてください。難しくありません。
補助関数が記述されているため、他の 2 つの関数は非常に簡単です:
<テーブル>
1 | public function printStack() { |
2 | if(true === C('debug')) { |
パブリック関数 printStack() {
3 | echo parent::getTraceAsString(); |
4 | } else { |
2
5 | $this->_toLogFile(parent::getTraceAsString()); |
6 | $this->_outputErrorPage(); |
7 | } |
8 | } |
echoparent::getTraceAsString();
4
1 | public function __toString() { |
2 | if(true !== C('debug')) { |
3 | $this->_toLogFile(parent::getTraceAsString()); |
4 | $this->_outputErrorPage(); |
5 | exit(); |
6 | } |
7 | return parent::__toString(); |
8 | } |
もちろん、__toString は文字列を返すので、例外がスローされると、例外情報が直接表示されます。デバッグ終了後にページに例外情報が表示されないように、ここで直接終了します。もちろん、これより良い方法はまだ思い浮かばないので、printStack を使用することをお勧めします。
私の例外クラスはアイデアを紹介するために使用されますので、何か良い方法があれば、もっとコミュニケーションを取り、お互いに学び、お互いに成長してください。
もちろん、ここでは例外処理用の基本クラスを定義するだけです。後で、例外について多くのサブクラスを記述します。実際に使用するときは、そのサブクラスが呼び出されます。