6

エラーをスローするこの方法を使用する必要があります:

if (isset($this->dbfields[$var])) {
    return $this->dbfields[$var];
} else {
    throw new FieldNotFoundException($var);
}

またはこのスタイル:

try {
    return $this->dbfields[$var];
} catch (Exception $e) {
    throw new FieldNotFoundException($var);
}

...またはまったく別のものですか?

コードの簡単な説明: $this->dbfieldsは配列です。isset()変数が設定されているかどうか、この場合は配列要素が存在するかどうかをチェックします。

4

7 に答える 7

10

2番目の例は悪いです。あなたが示しているように、そもそも例外を防ぐのと同じくらい簡単な場合でも、例外をキャッチするために多くのオーバーヘッドがかかります。さらに、その例外がスローされた理由を知っていると仮定します-メモリ不足などの他の例外があった場合、そうでなくても「フィールドが見つかりません」として報告しています。

try/catchは、C++ や Java などの言語では、すべての状態を保存および復元する必要があるため、非常にコストがかかることに注意してください。一方、Python には非常に安価な例外があり、単純な検証のためにtry/を使用することを積極的に推奨しています。exceptそれでも、すべてをキャッチして、それを 1 つのタイプの例外のふりをすることは、依然として悪いことです。

于 2008-10-13T00:52:08.313 に答える
4
//First let's do the checks.
if(!isset($this->dbfields[$var]))
    throw new FieldNotFoundException($var);
//Now we're in the clear!
return $this->dbfields[$var];
于 2008-10-13T00:53:41.493 に答える
3

「例外」をキャッチすることは、ほとんどの場合、良い習慣とは見なされません.表示された2つのうち、オプション1を使用します.

すべての例外をキャッチすると、別の例外が隠され、FileNotFoundException としてマスクされる場合があります。

于 2008-10-13T00:52:09.577 に答える
2

私は最初のものを好みますが、存在しない要素にアクセスしたときに dbfields[$var] が妥当なものをスローする場合は、チェックせずにそれを返すことを好みます。

正当な理由がない限り、例外の種類を変更することは特に好きではありません。変更する場合は、元の例外とスタック トレースを保持するようにしてください。

于 2008-10-13T00:53:51.150 に答える
0

あなたの説明をもう一度読み直してください。

#1のメソッドは、スローされる可能性のある例外をキャッチし、単純にboolを返すと思います。ほとんどの場合、一般的な例外をキャッチするのは絶対に好きではないので、#2 は私の選択ではありません。

于 2008-10-13T00:54:43.957 に答える
0

「……それとも、まったく別の何か?」

どちらもあまり良くないので、別のものが適切でしょう。

考えられるすべての例外ではなく、正しい例外をキャッチするようにバージョン 2 を修正します。それをオプション 3 として投稿しますException

于 2008-10-13T01:08:39.967 に答える
0

これは、言語に依存しないとは言えません。

一部の言語では、存在しないフィールドにアクセスしてもエラーがスローされず、優先パターンは配列、テーブル、オブジェクトなどの実装に大きく依存します。

于 2008-10-13T01:17:46.687 に答える