私はこのようなコードを持っています:
try {
$var = $object->getCollection()->first()->getItem()->getName();
} catch(\Exception $e) {
$var = null;
}
もちろん、通信変数とメソッド名があります。これは単なるデモンストレーションです。
したがって、私のコレクションが空の場合、Collection :: first()はfalseを返します。次に、getItem呼び出しはSymfony\Component\Debug\Exception\FatalErrorExceptionをスローしますが、上記のコードではキャッチされません。
私の質問は、この例外をどのようにキャッチできますか? nullを返すことができる多くのゲッターを持つこのような長いチェーンがあります。だから私はすべての値をnullでチェックするよりもこの方法を好む。
OK。回避策を見つけました。致命的なエラーではなく、単純な例外をスローするプロパティアクセサーコンポーネントを使用します。
$pa = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor();
try {
$var = $pa->getValue($object, 'collection[0].item.name');
} catch(\Exception $e) {
$var = null;
}
代わりにThrowable classを使用してくださいExceptionclass:
try {
$var = $object->getCollection()->first()->getItem()->getName();
} catch(\Throwable $e) {
$var = null;
$msg = $e->getMessage();
}
PHP 7.0で、致命的で回復可能なエラーからスローされる例外は、新しい別個の例外クラスError
のインスタンスです。この新しいError
クラスはThrowable
インターフェイスは、Exception
のメソッドとほぼ同じメソッドを指定します。Throwable
は階層が高いため、\ Errorと\ Exceptionの両方でキャッチできます。
interface Throwable
|- Exception implements Throwable
|- ...
|- Error implements Throwable
|- TypeError extends Error
|- ParseError extends Error
|- ArithmeticError extends Error
|- DivisionByZeroError extends ArithmeticError
|- AssertionError extends Error
here を見るとわかるように、FatalErrorExceptionは ErrorException (PHP)を拡張しています。PHP Exception クラスです。
すべての要素が揃ったので、次のステップに進む準備ができました:例外の名前が示すように、これはFatalErrorです(PHPに関連する概念で、Symfony2ではありません;その場合彼らは、おそらくインターフェースの目的のために、このエラーのラッパークラスを構築しました)。
PHP致命的なエラーはキャッチ可能なものではないので、try ... catch
ブロック内でFatalErrorを引き起こす可能性のあるコードを保持するのはかなり役に立たない
一般的な適切なルールとして、戻り値がアクセス可能になる前に、可能な場合は常にチェックする必要があります。
私は私の答えに賛成票を見たのでafter PHP7がリリースされたので、警告します PHP7は致命的なエラーをキャッチできるため PHPバージョン<7。
私のために働く(PHP 7.0、Symfony 3.0.9):
use Symfony\Component\Debug\Exception\FatalThrowableError;
...
try {
throw new FatalErrorException("something happened!", 0, 1, __FILE__, __LINE__);
} catch (FatalErrorException $e) {
echo "Caught exception of class: " . get_class($e) . PHP_EOL;
}
出力:
Caught exception of class: Symfony\Component\Debug\Exception\FatalErrorException