web-dev-qa-db-ja.com

laravel)で例外をキャッチできません

私は次の状況にあります:

  try {

        DB::beginTransaction();

        $task = new Task();
        $task->setTracker("");
        //thrown \Symfony\Component\Debug\Exception\FatalThrowableError


            DB::commit();

        }catch (\Exception $e){
            DB::rollBack();
            Log::error($e);
            //throw $e;
        }

キャッチエリアには入っていません。
理由は何かわかりますか?

更新

これはスローされたエラーです:

[Symfony\Component\Debug\Exception\FatalThrowableError]
Type error: Argument 1 passed to App\Models\Task::setTracker() must be an instance of Carbon\Carbon, integer given, called in /var/www/app/Services/ShareLogic.php on line 60

捕まえられない

ありがとう

9
SexyMF

キャッチ Throwable トリックを行いました。
理由がわかりませんか?誰かしますか?

15
SexyMF

\Exceptionが拡張されていないSymfony\Component\Debug\Exception\FatalThrowableErrorをキャッチしようとしているため、例外はキャッチされません。

代わりに、インポートして実際の例外をキャッチしてみてください。

use Symfony\Component\Debug\Exception\FatalThrowableError;

そして、あなたはすることができます。

try {
    // 
} catch(FatalThrowableError e) {
    // 
}

編集

さて、上記の解決策に加えて、PHP 7+はPHP 5。とは少し異なる方法でエラーを処理するようです。だからこれを試してください。

try {
    // 
} catch(Error $e) {
    // This should work
} catch(Throwable $e) {
    // This should work as well
}
2
Saeed Prez

Symfonyのデバッグコンポーネントは、あらゆる種類のエラーをログに記録して報告するためにはるかに洗練されていますが、この簡単な例(php 7.1.x)を見てください。

_<?php

class MyUncatchableError extends Exception {}

function myExceptionHandler($e) {
    throw new MyUncatchableError('BANG: '.$e->getMessage());
}

set_exception_handler('myExceptionHandler');

$foo = true;

try {
    $foo->modify();
} catch (Exception $e) {
    echo 'nope';
} catch (MyUncatchableError $e) {
    echo 'nope2';
}
_

結果はどうなりますか?上手:

致命的なエラー:Uncaught MyUncatchableError:BANG:/ in/WJErU:6のブール値でメンバー関数modify()を呼び出す

スタックトレース:

  • 0 [内部関数]:myExceptionHandler(Object(Error))
  • 1 {メイン}

    6行目の/ in/WJErUにスローされます

そして、オリジナルをキャッチする必要があるため、その例外をキャッチすることはできません。ここでスロー可能です。これは、この種の「エラー」の場合は エラー です。 「エラー」クラスをキャッチすることでキャッチできます。また、PHP7階層では、Throwableインターフェイスが実装されているため、Exceptionを使用してキャッチすることはできません(ExceptionはThrowableを実装しているため、Errorは例外ではありません-参照: http://php.net/manual/en/ language.errors.php7.php )。

これはPHP7 +にも当てはまります。これは、5。*ではThrowableもErrorも発生せず、$foo->modify();を実行するとスクリプトが停止し、致命的なエラーが返されるためです。独自のエラーハンドラー(_set_error_handler_)を作成し、そこで例外をスローすることができます(そして、デバッグコンポーネントはphp 5. *に対してそれを行います)が、このメソッドは致命的なエラーに対しては機能しません。代わりに、Debugコンポーネントは script shutdown にフックし、最後のエラーを読み取り、 FatalErrorException をスローします。

私はSymfonyを深く掘り下げていないので、この説明は完全に正確ではないかもしれませんが、ここでアイデアを得ることができます。

1
Cliff Edge