私は次の状況にあります:
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
捕まえられない
ありがとう
キャッチ Throwable
トリックを行いました。
理由がわかりませんか?誰かしますか?
\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
}
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を深く掘り下げていないので、この説明は完全に正確ではないかもしれませんが、ここでアイデアを得ることができます。