Rumah >rangka kerja php >Laravel >Artikel yang menerangkan secara terperinci cara mengendalikan pengecualian dalam Laravel
Dalam artikel ini, kami akan meneroka salah satu ciri yang paling penting dan paling kurang dibincangkan dalam rangka kerja web Laravel - 异常处理
. Laravel dilengkapi dengan pengendali pengecualian terbina dalam yang membolehkan anda melaporkan dan mengemukakan pengecualian dengan mudah dengan cara yang mesra.
Pada separuh pertama artikel, kami akan meneroka tetapan lalai yang disediakan oleh pengendali pengecualian. Sebenarnya, kita akan terlebih dahulu memahami cara Laravel mengendalikan pengecualian melalui kelas Pengendali lalai.
Pada separuh kedua artikel, kami akan terus memperkenalkan cara membuat pengendali pengecualian tersuai supaya anda boleh menangkap pengecualian tersuai.
Sebelum mula mengkaji kelas pengendalian pengecualian, mari kita lihat dahulu beberapa konfigurasi parameter penting yang berkaitan dengan pengecualian.
Buka fail config/app.php
dan lihat lebih dekat pada coretan kod di bawah.
... ... /* |-------------------------------------------------------------------------- | 应用的调试模式 |-------------------------------------------------------------------------- | | 当引用处于调试模式,将会显示错误产生式的详细堆栈信息 | 如果禁用,则只显示一个简单的错误页面 | */ 'debug' => env('APP_DEBUG', false), ... ...
Seperti yang anda boleh teka daripada nama parameter, jika ditetapkan kepada TRUE
, ia akan membantu kami menyahpepijat ralat yang dihasilkan oleh aplikasi. Nilai lalai ditentukan oleh parameter .env
dalam APP_DEBUG
fail konfigurasi pembolehubah persekitaran.
Dalam persekitaran pembangunan, anda disyorkan untuk menetapkannya kepada TRUE
, supaya melalui maklumat tindanan ralat yang jelas, anda boleh mencari punca ralat dengan cepat dan membetulkannya. Di samping itu, apabila dalam persekitaran formal, kita perlu mematikannya melalui item konfigurasi pembolehubah persekitaran Apabila ralat berlaku, hanya halaman gesaan umum akan dipaparkan.
Selain memaparkan ralat pada halaman, Laravel juga membenarkan anda melog ralat ke fail log. Sekarang, mari kita lihat konfigurasi berkaitan pengelogan Buka fail config/app.php
dan lihat lebih dekat pada coretan kod berikut.
... ... 'log' => env('APP_LOG', 'single'), 'log_level' => env('APP_LOG_LEVEL', 'debug'), ... ...
Dalam rangka kerja Laravel, pustaka Monolog digunakan untuk merekodkan log. Anda boleh mengkonfigurasi perpustakaan Monolog melalui item konfigurasi di atas.
Laluan menyimpan fail log lalai ialah storage/logs/laravel.log
Biasanya, anda tidak perlu menukarnya. Pada masa yang sama, anda boleh lulus APP_LOG_LEVEL
untuk menentukan tahap ralat yang perlu dilog ke fail log.
Konfigurasi asas pengecualian dan log telah diperkenalkan lebih awal.
Seterusnya, mari kita lihat kelas pengendalian pengecualian lalai untuk aplikasi Laravel. Buka fail app/Exceptions/Handler.php
.
<?php namespace App\Exceptions; use Exception; use Illuminate\Auth\AuthenticationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { /** * 定义无需报告的异常类型 * * @var array */ protected $dontReport = [ \Illuminate\Auth\AuthenticationException::class, \Illuminate\Auth\Access\AuthorizationException::class, \Symfony\Component\HttpKernel\Exception\HttpException::class, \Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Session\TokenMismatchException::class, \Illuminate\Validation\ValidationException::class, ]; /** * 报告或者通过日志记录一个异常 * * 可以在这个方法中将异常报告给 Sentry, Bugsnag 等平台 * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); } /** * 将异常通过 Http 返回 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { return parent::render($request, $exception); } /** * 将认证相关的异常转换为未认证的响应(401) * * @param \Illuminate\Http\Request $request * @param \Illuminate\Auth\AuthenticationException $exception * @return \Illuminate\Http\Response */ protected function unauthenticated($request, AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['error' => 'Unauthenticated.'], 401); } return redirect()->guest(route('login')); } }
Kelas pemprosesan di atas terutamanya mengandungi 2 fungsi: melaporkan dan memaparkan semua maklumat pengecualian.
Mari kita lihat dengan lebih dekat kaedah report
. Kaedah laporan
/** * 报告或记录一个异常。 * * 这是一个将异常发送给 Sentry 和 Bugsnag 等机构的好时机。 * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); }
digunakan untuk mengelog ralat ke fail log. Juga, beri perhatian kepada atribut dontReport
yang penting, yang menyenaraikan semua kategori pengecualian yang tidak sepatutnya dilog.
Seterusnya, kami memperkenalkan kaedah render
.
/** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { return parent::render($request, $exception); }
Jika kaedah report
digunakan untuk log atau melaporkan ralat, maka kaedah render
digunakan untuk membuat ralat dan memaparkannya pada skrin. Malah, kaedah ini menentukan kandungan yang akan dipaparkan kepada pengguna apabila pengecualian berlaku. Kaedah
render
juga membolehkan anda menyesuaikan nilai respons untuk pelbagai kategori ralat, yang akan kita pelajari dalam bab seterusnya.
Akhir sekali, kaedah unauthenticated
mengendalikan pengecualian AuthenticationException
, di mana anda boleh menentukan kandungan yang dipaparkan apabila pengguna mengakses halaman yang tidak dibenarkan.
Dalam bahagian ini, kami akan mencipta kelas pengecualian tersuai untuk mengendalikan pengecualian kategori CustomException
. Idea di sebalik mencipta kelas pengecualian tersuai adalah untuk mengurus pengecualian tersuai dengan lebih mudah sambil memaparkan respons tersuai.
Mulakan dengan mencipta fail app/Exceptions/CustomException.php
dengan kandungan berikut.
<?php namespace App\Exceptions; use Exception; class CustomException extends Exception { /** * 报告这个异常。 * * @return void */ public function report() { } /** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ public function render($request) { return response()->view( 'errors.custom', array( 'exception' => $this ) ); } }
Adalah penting untuk ambil perhatian bahawa kelas CustomException
mesti mewarisi kelas teras Exception
. Untuk tujuan demonstrasi, kami hanya membincangkan kaedah pemaparan, tetapi jelas sekali anda juga boleh menyesuaikan kaedah laporan.
Seperti yang anda lihat, dalam contoh kami mengubah hala pengguna ke halaman ralat errors.custom
. Dengan cara ini anda boleh melaksanakan halaman ralat tersuai untuk jenis pengecualian tertentu.
Sudah tentu, kita perlu mencipta fail paparan yang berkaitan resources/views/errors/custom.blade.php
.
Exception details: <b>{{ $exception->getMessage() }}</b>
Ini ialah fail paparan yang agak mudah yang hanya memaparkan mesej ralat satu baris, tetapi anda boleh mereka bentuk paparan dengan cara yang anda mahukan.
Kami juga perlu membuat beberapa pengubahsuaian dalam kaedah pemaparan fail app/Exceptions/Handler.php
untuk memastikan kelas pengecualian tersuai kami boleh dipanggil. Mari gantikan kaedah render dalam fail app/Exceptions/Handler.php
dengan yang berikut.
... ... /** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { if ($exception instanceof \App\Exceptions\CustomException) { return $exception->render($request); } return parent::render($request, $exception); } ... ...
Seperti yang anda lihat, kami akan menyemak terlebih dahulu jenis pengecualian dalam kaedah pemaparan. Jika kategori pengecualian ialah AppExceptionsCustomException
, kami akan memanggil kaedah render kelas ini.
Semuanya sudah siap. Kini kami mencipta kawalan app/Http/Controllers/ExceptionController.php
untuk menguji kelas pengecualian tersuai.
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class ExceptionController extends Controller { public function index() { // 出错了,你可以抛出自定义的异常 CustomException throw new \App\Exceptions\CustomException('Something Went Wrong.'); } }
当然,你需要先在 routes/web.php
文件中添加相关的路由,就像下面一样。
// Exception routes Route::get('exception/index', 'ExceptionController@index');
之后,你可以浏览 http://your-laravel-site.com/exception/ind... 地址来查看是否和预期的一样。一切正常的话,页面将显示我们前面配置 errors.custom
视图。
就这样,你就可以按自己方式来处理 Laravel 中的异常。
完!尽情享受 Laravel 带来的编码的乐趣吧!
今天,我们认真学习了 Laravel 中的异常处理特性。在文章的开头,我们搜索了 Laravel 提供的一些基础配置,用于显示和报告异常。紧接着,我们简要介绍了默认的异常处理类。
在文章的后半部分,我们通过创建一个自定义异常处理类,演示如何在应用中处理自定义的异常。
对于那些刚刚起步学习 Laravel ,或者期待拓展阅读相关知识、网站、应用扩展的读者,这里有一系列您能够学习的内容,参见 Envato Market 。
期待听到任何形式的咨询或建议!
原文地址:https://code.tutsplus.com/tutorials/exception-handling-in-laravel--cms-30210
译文地址:https://learnku.com/laravel/t/8783/exception-handling-in-laravel
【相关推荐:laravel视频教程】
Atas ialah kandungan terperinci Artikel yang menerangkan secara terperinci cara mengendalikan pengecualian dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!