web-dev-qa-db-ja.com

symfony FatalErrorExceptionをキャッチできません

私はこのようなコードを持っています:

try {
    $var = $object->getCollection()->first()->getItem()->getName();
} catch(\Exception $e) {
    $var = null;
}

もちろん、通信変数とメソッド名があります。これは単なるデモンストレーションです。

したがって、私のコレクションが空の場合、Collection :: first()はfalseを返します。次に、getItem呼び出しはSymfony\Component\Debug\Exception\FatalErrorExceptionをスローしますが、上記のコードではキャッチされません。

私の質問は、この例外をどのようにキャッチできますか? nullを返すことができる多くのゲッターを持つこのような長いチェーンがあります。だから私はすべての値をnullでチェックするよりもこの方法を好む。

27
Jumi

OK。回避策を見つけました。致命的なエラーではなく、単純な例外をスローするプロパティアクセサーコンポーネントを使用します。

$pa = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor();
try {
    $var = $pa->getValue($object, 'collection[0].item.name');
} catch(\Exception $e) {
    $var = null;
}
0
Jumi

代わりに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
46
J.C. Gras

here を見るとわかるように、FatalErrorExceptionは ErrorException (PHP)を拡張しています。PHP Exception クラスです。

すべての要素が揃ったので、次のステップに進む準備ができました:例外の名前が示すように、これはFatalErrorです(PHPに関連する概念で、Symfony2ではありません;その場合彼らは、おそらくインターフェースの目的のために、このエラーのラッパークラスを構築しました)。

PHP致命的なエラーはキャッチ可能なものではないので、try ... catchブロック内でFatalErrorを引き起こす可能性のあるコードを保持するのはかなり役に立たない

一般的な適切なルールとして、戻り値がアクセス可能になる前に、可能な場合は常にチェックする必要があります。

更新

私は私の答えに賛成票を見たのでafter PHP7がリリースされたので、警告します PHP7は致命的なエラーをキャッチできるため PHPバージョン<7。

13
DonCallisto

私のために働く(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

0
iloo