2

例外に関して既に尋ねた質問に基づいて、私はphp関数を間違って書いているか、例外の使用を悪用しているのではないかと心配しています。私がこれを言う理由は、try/catch ブロックを使用してカスタム例外をキャッチする場合、次の関数を使用するためです。

public function get_specific_page($page) {
    if (!is_array( $this->_page )){
        throw new AisisCore_Template_TemplateException( "<div class='error'>Trying to get a property from a non array.</div>" );
    }

    return $this->_page[$page];
}

次に、次のように呼び出されます。

try{
    get_specific_page($page);
}
catch(Exception $e){
    echo $e->getMessage();
}

このアプローチの問題は、このように記述された多くの関数があり、ファイルが存在するかどうかを確認してエラーをスローすることです。値が配列に設定されているかどうかを確認し、エラーをスローします。私の問題は、これらの関数呼び出しを処理するファイルが try catch でオーバーロードされる可能性があることです.....

したがって、私の質問は、try catch ステートメントで過剰にロードされた php ファイルがなくても、独自のカスタム関数を使用できるように、このような関数をどのように記述すればよいかということです。

関数自体の中に try catch を書くのと同じくらい明白ですか?

私が尋ねる理由は、もし私が有名企業や、上記のように私たちの関数を書いている会社で働くことに慣れているからです. これらの関数が大量にあるコードベースをどのように扱ってきましたが、それらを使用しているファイルの半分がたくさんのトライキャッチを実行しているとは思いません...

アップデート:

私は例外をよりよく理解するために zend ソースを調べていて、これに出くわしました:

public function setMessage($messageString, $messageKey = null)
    {
        if ($messageKey === null) {
            $keys = array_keys($this->_messageTemplates);
            foreach($keys as $key) {
                $this->setMessage($messageString, $key);
            }
            return $this;
        }

        if (!isset($this->_messageTemplates[$messageKey])) {
            require_once 'Zend/Validate/Exception.php';
            throw new Zend_Validate_Exception("No message template exists for key '$messageKey'");
        }

        $this->_messageTemplates[$messageKey] = $messageString;
        return $this;
    }

下部近くに新しい例外メッセージをスローする方法を確認できます。この関数は、次のようにして呼び出されることはありません。

try{}catch(){}

それでも例外がスローされた場合、「メッセージ付きのキャッチされていない例外」の問題はありません

4

1 に答える 1

3

私の意見では、あなたのアプローチは一般的に正しいです。ただし、いくつかの注意事項:

  1. 例外メッセージでは HTML 形式を使用しないでください。通常、スローした例外がどのように処理されるかはわかりません。たとえば、例外ハンドラーはメッセージをログ ファイルに書き込み (HTML フォーマットは必要ありません)、特別なエラー ビューでユーザーに表示します (この場合、ビュー自体に HTML フォーマットが含まれている必要があります)。または単に無視します(とにかく、フォーマットする必要はありません)。
  2. 処理できる例外のみをキャッチします。関数. AisisCore_Template_TemplateException_ を使用して、キャッチされていないすべての例外をデフォルトでキャッチする例外ハンドラーを定義できます (これはおそらく、Zend Framework の例の場合です)。簡単に言うと、例外の処理方法がわかっている場所でのみ例外をキャッチしますset_exception_handler
  3. 制御フローで (予期しない) 例外を処理するために、名前が示すように例外のみを使用してください。例外を使用してプログラムの通常のフローを制御することは可能ですが、一般的に悪い設計と見なされます (補足として、コード サンプルは問題ないように見えます)。

完全を期すために、例外の使用に代わるいくつかの方法があります。

  1. 例外の代わりにリターン コードを使用します。これは昔ながらの C スタイルです。利点は、try/catch ステートメントでステートメントをラップする必要がないことです。ただし、各プロシージャの戻り値を確認する必要があり、忘れがちです。一方、例外を使用すると、キャッチされない例外がデフォルトで致命的なエラーを生成するため、予期しないエラーのリスクが軽減されます。
  2. PHP エラーを使用します。trigger_errorこれについては、関数を参照してください。ただし、カスタム エラーを PHP でキャッチすることはほとんど不可能です (set_error_handlerグローバル レベルでのみ機能する を使用する場合を除く)。
于 2013-02-18T22:34:07.677 に答える