PHP では、try/catch でいくつかの例外をキャッチすることがあります。
try {
...
} catch (Exception $e) {
// Nothing, this is normal
}
この種のコードで$e
は、何も作成されない変数 (多くのリソース) が作成され、使用されていない変数のために PHP_MD (PHP Mess Detector) が警告を生成します。
PHP では、try/catch でいくつかの例外をキャッチすることがあります。
try {
...
} catch (Exception $e) {
// Nothing, this is normal
}
この種のコードで$e
は、何も作成されない変数 (多くのリソース) が作成され、使用されていない変数のために PHP_MD (PHP Mess Detector) が警告を生成します。
PHP 5,7
いいえ、ただし設定を解除できます。
try {
...
} catch (Exception $e) {
// Nothing, this is normal
unset($e);
}
この問題の原因が 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
場合は変数を宣言する必要があります。
これが例外の要点です。複数の異なる catch ブロックを使用して、処理したい例外をキャッチできます。例外のデータはどこかに割り当てる必要があるため、変数です。unset($e)
これらの警告を本当に見たくない場合は、catch ブロック内のようなことを行うか、警告を無効にすることができます (一般的には悪い考えです)。
いいえ。
いずれにせよ、例外をキャッチして何もしないのは一般的には悪い考えです。例外は、例外的な状況を処理することを強制するために正確に存在します (そうでない場合、実行は中止されます)。そのため、言語がそのようなユースケースを容易にしないことは理解できます。
私は、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 は完全に有効です。
!File::exists($fileName)
チェックを実行している可能性が非常に高いです。したがって、すでに行われた呼び出しを無駄にしています。File::create
が予期しない他の例外をスローする場合は、それらをキャッチすることをお勧めします。
結論
何かが決して良い考えではないと述べるのは、ほとんど決して良い考えではありません。ルールには常に例外があります (へへ)。慣例や設計パターンと同様に、これは経験の浅い開発者が正しい決定を下せるようにするための単なる経験則です。
PHP 8.0の時点では、変数なしで入力できますが、それぞれの一般的なケースException
はThrowable
. クラスException
は を実装しThrowable
ます。
try {
...
} catch (CustomException) {
// CustomException
} catch (Throwable) {
//All other classes implementing Throwable interface
}
例外は、例外的な状況でのみ使用されるわけではありません。
このシナリオでは、実際に例外を使用して、ユーザーがログアウトされていることを確認します。スクリプトのこの時点では、どのデータをプルーニングする必要があるかを判断するのに非常に多くのリソースが費やされるため、すべてのデータをプルーニングして例外をキャッチする方が実際には高速です。
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);