1

これは、よりアーキテクチャ上の問題です。完全なオブジェクト指向の PHP 環境でエラーを適切に処理する方法について、人々の意見を知りたいです。

たとえば、データベースからすべてのユーザー データを取得するクラスがあります。したがって、次のように使用します。

$userData = new UserDataConnection();
$userData->openDatabase();
$userData->retrieveData();
$userData->showData();
$userData->closeDatabase();

これらの各ステップで、エラーが発生する可能性があります。したがって、関数が正常に実行されたかどうかを示すブール値を各ステップから返すか (したがって、エラー チェックは各関数内で行われます)、それとも try-catch 例外処理をすべて実行しますか? またはより良い方法はありますか?

また、何らかのエラーが発生した場合は、常に何らかのエラー ページに移動する方がよいでしょうか。

4

2 に答える 2

1
<?php

$ERROR = false;
try {

    $userData = new UserDataConnection();
    $userData->openDatabase();
    $userData->retrieveData();
    $DETAILS = $userData->showData();
    $userData->closeDatabase();

} catch( Exception $e ) {

    $ERROR = $e->getMessage(); // exit;

}

if( $ERROR ) {
    $DETAILS = array();
}

?>

PDO を使用している場合は、PDOException をスローできます。

于 2013-02-22T09:57:37.807 に答える
1

それは通常、簡単な質問に要約されます。

この関数は「正当に」失敗する可能性がありますか、それとも失敗は何かが本当に間違っていることの兆候ですか?

関数が特定の種類の入力を予期し、別の種類の入力で呼び出されてはならない場合、正しい入力を提供できないとエラーになりますInvalidArgumentException。これは、ユーザー入力を直接処理しない関数に特に当てはまります。これは、型ヒントを使用するとさらにうまく機能します。

正しい入力が与えられた場合、関数が常に特定の結果を生成する必要がある場合、その結果を生成できない関数の失敗は、RuntimeExceptionまたはLogicExceptionその他の種類の例外です。

関数が何らかの結果を生成する場合と生成しない場合falseは、正当な戻り値です。ユーザー入力を処理するため、非常に任意の入力値を取得する関数は、多くの場合、 を返しても問題ありませんfalse

いくつかの例:

  • getDatabaseConnection()RuntimeExceptionデータベースへの接続を確立できない場合は、または同様のものをスローすることは完全に正しいです。これは、作業を続行できない例外的な状況です。
  • transformFooIntoBar(Foo $foo)Bar何らかの理由でインスタンスを返すことができない場合、何らかの形の例外をスローすることは正しいです。関数には明確な目的と、型チェックされた入力値があります。そのような明確な状況下で機能しない場合は、明らかに何かが間違っており、修正する必要があります。したがって、例外です。
  • checkIfUserExists($id)falseその仕事は親指を立てるか親指を下げることであるため、 を返す可能性があります。この職務内容を考えると、ユーザーが存在しないことは例外的な状況ではありません。

スローされた例外をキャッチする場所は、どこで処理するかによって異なります。データベースがダウンしている場合はおそらく何もできないため、データベース接続エラーはコール スタックの最上部でキャッチされるはずです。
一方、一部のモジュールが一部のサブモジュールを呼び出しており、半分がそのサブモジュールが失敗することを期待している場合、および/または失敗した場合の緊急時対応計画がある場合、モジュールはサブモジュールの例外をキャッチし、その仕事を続けます。たとえばgetRSSUpdates()、 への呼び出しを行いますHTTP::fetchContents($url)。URL が 404 を返す場合、HTTPこのような状況ではコンテンツを返すことができないため、モジュールは例外をスローする可能性があります。ただし、関数はこれgetRSSUpdates()に備えており、このケースを「現時点では更新なし」として処理します。

于 2013-02-22T11:57:51.473 に答える