web-dev-qa-db-ja.com

キャッチで何もせずに例外をキャッチする

PHPでは、try/catchを使用して例外をキャッチすることがあります。

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

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

変数を作成せずに例外をキャッチする方法はありますか?

ありがとう

32
Matthieu Napoli

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

try {
    ...
} catch (Exception $e) {
    unset($e);
}

私はあなたが例外をキャッチしているだけだと思っています。 catchを使用する場合は、tryを使用する必要があります。したがって、例外をキャッチするのが悪い考えであるかどうかに関する人々の意見は無関係です。 try/catchを使用せずに、必要な結果を得るように努力する必要があります。私が知っている限り、代替手段はありません。

私はテンプレートエンジンにこのようなものを使用しています。

//array of templates ordered by version new to old.
for($templates as $tpl){
    try {
        $output = render($tpl,$data);
        //it worked
        break;
    } catch(ErrorException $e){
        unset($e);
    }
}
if(!empty($output)){
    return $output;
}
8
TarranJones

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

6
Marc B

番号。

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

6
Artefacto

マークBとアルテファクトの答えには基本的に同意しません。キャッチを省略した方がよい場合や、唯一のオプションでさえある場合があります。特に、外部ライブラリ(どの例外がスローされるかを制御できない場合)や非同期操作を使用する場合は特にそうです。

例:

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

オプション1(キャッチを省略できた場合):

_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)チェックを実行している可能性が非常に高いです。したがって、すでに行われている通話を無駄にしています。

結論

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

3
Wouter Florijn