47

PHP では、try/catch でいくつかの例外をキャッチすることがあります。

try {
    ...
} catch (Exception $e) {
    // Nothing, this is normal
}

この種のコードで$eは、何も作成されない変数 (多くのリソース) が作成され、使用されていない変数のために PHP_MD (PHP Mess Detector) が警告を生成します。

4

7 に答える 7

17

PHP 8 @seeでできます

PHP 5,7

いいえ、ただし設定を解除できます。

try {
    ...
} catch (Exception $e) {
    // Nothing, this is normal
    unset($e);
}

この問題の原因が PHPMD である場合は、警告を抑制することができます。

PHPMD 抑制警告

class Bar {
    /**
     * This will suppress UnusedLocalVariable
     * warnings in this method
     *
     * @SuppressWarnings(PHPMD.UnusedLocalVariable)
     */
    public function foo() {

        try {
            ...
        } catch (Exception $e) {
            // Nothing, this is normal
            unset($e);
        }
    }
}

私は、あなたがしたいのでそうする必要がないので、例外をキャッチしているだけだと思います。PHP 5,7 では、使用するcatch場合は a を使用する必要がありtry、a を使用するcatch場合は変数を宣言する必要があります。

于 2015-02-06T12:25:35.280 に答える
8

これが例外の要点です。複数の異なる catch ブロックを使用して、処理したい例外をキャッチできます。例外のデータはどこかに割り当てる必要があるため、変数です。unset($e)これらの警告を本当に見たくない場合は、catch ブロック内のようなことを行うか、警告を無効にすることができます (一般的には悪い考えです)。

于 2011-01-27T18:21:57.043 に答える
7

いいえ。

いずれにせよ、例外をキャッチして何もしないのは一般的には悪い考えです。例外は、例外的な状況を処理することを強制するために正確に存在します (そうでない場合、実行は中止されます)。そのため、言語がそのようなユースケースを容易にしないことは理解できます。

于 2011-01-27T18:22:53.560 に答える
7

私は、Marc B と Artefacto の回答に根本的に同意しません。キャッチを省略した方が良い場合や、唯一の選択肢でさえある場合があります。特に、外部ライブラリ (スローされる例外を制御できない場合) および/または非同期操作を使用する場合。

例えば:

まだ存在しない場合にのみファイルを作成したい。外部 I/O ライブラリを使用しています。File::exists($fileName)およびFile::create($fileName)メソッドがあると想像してください。

オプション 1 (catch を省略できる場合):

try {
    File::create($fileName);
}
// Go on with the rest of the code.

オプション 2 (try/catch なし):

if (!File::exists($fileName))
    File::create($fileName);

ここで、オプション 2 には 2 つの重要な問題があるため、オプション 1 は完全に有効です。

  1. 複数のスレッドが同時に実行され、このコード セクションを処理している場合、スレッド A が最初にファイルの存在を確認する可能性があります。次に、スレッド B はファイルが存在するかどうかを確認します。彼らは両方ともそれが存在しないことに気づきます。スレッド A がファイルを作成します。その後、スレッド B は再度作成を試み、if チェックを使用していても例外をスローします。
  2. ライブラリ自体がすでに!File::exists($fileName)チェックを実行している可能性が非常に高いです。したがって、すでに行われた呼び出しを無駄にしています。

File::createが予期しない他の例外をスローする場合は、それらをキャッチすることをお勧めします。

結論

何かが決して良い考えではないと述べるのは、ほとんど決して良い考えではありません。ルールには常に例外があります (へへ)。慣例や設計パターンと同様に、これは経験の浅い開発者が正しい決定を下せるようにするための単なる経験則です。

于 2018-12-25T11:39:24.773 に答える
0

PHP 8.0の時点では、変数なしで入力できますが、それぞれの一般的なケースExceptionThrowable. クラスExceptionは を実装しThrowableます。

try {
    ...
} catch (CustomException) {
    // CustomException
} catch (Throwable) {
    //All other classes implementing Throwable interface
}
于 2020-10-01T17:36:35.760 に答える
-4

例外は、例外的な状況でのみ使用されるわけではありません。

このシナリオでは、実際に例外を使用して、ユーザーがログアウトされていることを確認します。スクリプトのこの時点では、どのデータをプルーニングする必要があるかを判断するのに非常に多くのリソースが費やされるため、すべてのデータをプルーニングして例外をキャッチする方が実際には高速です。

        try {
        GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id());
        GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']);
    } catch(PDOException $ex) {}
    session_regenerate_id(true);
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true);
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true);
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true);
于 2013-05-13T17:26:08.787 に答える