Rumah > rangka kerja php > Laravel > teks badan

Artikel yang menerangkan secara terperinci cara mengendalikan pengecualian dalam Laravel

青灯夜游
Lepaskan: 2022-10-02 06:00:27
ke hadapan
2862 orang telah melayarinya

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.

Konfigurasi asas

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),
...
...
Salin selepas log masuk

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'),
...
...
Salin selepas log masuk

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'));
    }
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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.

Kelas pengecualian tersuai

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
                )
        );
    }
}
Salin selepas log masuk

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>
Salin selepas log masuk

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);
}
...
...
Salin selepas log masuk

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.');
    }
}
Salin selepas log masuk

当然,你需要先在 routes/web.php 文件中添加相关的路由,就像下面一样。

// Exception routes
Route::get('exception/index', 'ExceptionController@index');
Salin selepas log masuk

之后,你可以浏览 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!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!