kesilapan


Pengenalan

Konfigurasi
  • Pengecualian pengendali
  • Kaedah laporan
  • Kaedah render
    • Pengecualian Boleh lapor & Boleh Render
    • Halaman HTTPus
    • Pengenalan Apabila anda memulakan projek Laravel baharu, pengendalian ralat dan pengecualian sudah dikonfigurasikan untuk anda.
    • kelas bertanggungjawab untuk merekodkan semua pengecualian yang dicetuskan oleh aplikasi dan membentangkannya kepada pengguna. Dalam dokumen ini, kami akan meneroka kelas ini secara mendalam.

Konfigurasi

Pilihan debug dalam fail konfigurasi config/app.php anda menentukan jumlah maklumat yang sebenarnya akan dipaparkan kepada pengguna untuk ralat. Secara lalai, tetapan pilihan ini akan menghormati nilai pembolehubah persekitaran APP_DEBUG yang disimpan dalam fail .env. config/app.php 配置文件中的 debug 选项决定了对于一个错误实际上将显示多少信息给用户。默认情况下,该选项的设置将遵照存储在 .env 文件中的 APP_DEBUG 环境变量的值。

对于本地开发,你应该将 APP_DEBUG 环境变量的值设置为 true 。在生产环境中,该值应始终为 false 。如果在生产中将该值设置为 true ,则可能会将敏感配置值暴露给应用程序的终端用户。

异常处理器

Report 方法

所有异常都是由 AppExceptionsHandler 类处理的。这个类包含两个方法: reportrender 。我们将详细剖析这些方法。 report 方法用于记录异常或将它们发送给如 Bugsnag 或 Sentry 等外部服务。默认情况下, report 方法将异常传递给记录异常的基类。不过,你可以任何自己喜欢的方式来记录异常。

例如,如果你需要以不同方式报告不同类型的异常,则可以使用 PHP 的 instanceof 比较运算符:

/**
 * 报告或记录异常
 *
 * 此处是发送异常给 Sentry、Bugsnag 等外部服务的好位置。
 *
 * @param  \Exception  $exception
 * @return void
 */
 public function report(Exception $exception){  
   if ($exception instanceof CustomException) {     
      //    
    }   
   parent::report($exception);
 }

{tip} 不要在 report 方法中进行太多的 instanceof 检查,而应考虑使用 可报告异常(Reportable exception) 。

全局日志

在正常情况下, Laravel 会自动将当前用户的 ID 作为数据添加到每一条异常日志中。 你可以在通过重写 AppExceptionsHandler 类中的 context 方法来定义你的全局环境变量。 之后,这个变量将包含在每一条异常日志中:

/**
 * 定义默认的环境变量
 *
 * @return array
 */
 protected function context(){  
   return array_merge(parent::context(), [    
       'foo' => 'bar',   
      ]);
   }

report 辅助函数

有时你可能需要报告异常,但又不希望终止当前请求的处理。 report 辅助函数允许你使用异常处理器的 report 方法在不显示错误页面的情况下快速报告异常:

public function isValid($value){  
  try {       
   // 验证值...  
   } 
    catch (Exception $e) {  
        report($e);   
        return false;   
      }
   }

按类型忽略异常

异常处理器的 $dontReport

Untuk pembangunan setempat, anda harus menetapkan nilai pembolehubah persekitaran APP_DEBUG kepada true . Dalam persekitaran pengeluaran, nilai ini hendaklah sentiasa false . Jika anda menetapkan nilai ini kepada true dalam pengeluaran, anda boleh mendedahkan nilai konfigurasi sensitif kepada pengguna akhir aplikasi anda.

Exception handler🎜🎜🎜🎜 < div name="2e60ae" data-unique="2e60ae">🎜

Kaedah laporan

🎜Semua pengecualian dikendalikan oleh kelas AppExceptionsHandler. Kelas ini mengandungi dua kaedah: laporan dan render. Kami akan membedah kaedah ini secara terperinci. Kaedah laporan digunakan untuk mengelog pengecualian atau menghantarnya ke perkhidmatan luaran seperti Bugsnag atau Sentry. Secara lalai, kaedah report menghantar pengecualian kepada kelas asas yang merekodkan pengecualian. Walau bagaimanapun, anda boleh log pengecualian dalam apa jua cara yang anda suka. 🎜🎜Sebagai contoh, jika anda perlu melaporkan jenis pengecualian yang berbeza secara berbeza, anda boleh menggunakan operator perbandingan instanceof PHP: 🎜
/**
 * 不应被报告的异常类型清单。
 *
 * @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\Validation\ValidationException::class,];
🎜{tip} Jangan gunakan reportinstanceof semakan dalam kod> sebaliknya pertimbangkan untuk menggunakan pengecualian yang boleh dilaporkan. 🎜
🎜

Log global

🎜Dalam keadaan biasa, Laravel akan secara automatik menambah ID pengguna semasa sebagai data pada setiap entri dalam log pengecualian. Anda boleh menentukan pembolehubah persekitaran global anda dengan mengatasi kaedah context dalam kelas AppExceptionsHandler. Selepas itu, pembolehubah ini akan disertakan dalam setiap log pengecualian: 🎜
/**
 * 将异常转换为 HTTP 响应。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
 public function render($request, Exception $exception){ 
    if ($exception instanceof CustomException) {     
       return response()->view('errors.custom', [], 500);  
      }  
     return parent::render($request, $exception);
   }
🎜

laporan fungsi pembantu

🎜Kadang-kadang Anda mungkin perlu melaporkan pengecualian tetapi tidak mahu menamatkan pemprosesan permintaan semasa. Fungsi pembantu report membolehkan anda melaporkan pengecualian dengan cepat tanpa memaparkan halaman ralat menggunakan kaedah report pengendali pengecualian: 🎜
<?php
  namespace App\Exceptions;use Exception;
  class RenderException extends Exception{   
        /**
     * 报告异常
     *
     * @return void
     */   
   public function report()  
     {    
       //   
      }    
     /**
     * 转换异常为 HTTP 响应
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */  
    public function render($request) 
       {     
          return response(...); 
        }
     }
🎜

Abaikan pengecualian mengikut jenis

🎜Atribut $dontReport pengendali pengecualian mengandungi set jenis pengecualian yang tidak akan dilog. Sebagai contoh, pengecualian yang disebabkan oleh ralat 404 dan beberapa jenis ralat lain tidak ditulis pada fail log. Anda boleh menambah jenis pengecualian lain pada tatasusunan ini seperti yang diperlukan: 🎜
abort(404);
🎜🎜🎜🎜🎜🎜

Kaedah Render

Kaedah render bertanggungjawab untuk menukar pengecualian yang diberikan kepada respons HTTP yang akan dihantar semula ke penyemak imbas. Secara lalai, pengecualian dihantar kepada kelas asas yang menjana respons untuk anda. Walau bagaimanapun, anda boleh menyemak jenis pengecualian atau mengembalikan respons tersuai anda sendiri jika anda mahu: render 方法负责将给定的异常转换为将被发送回浏览器的 HTTP 响应。默认情况下,异常将传递给为你生成响应的基类。不过,你可以按自己意愿检查异常类型或返回自己的自定义响应:

abort(403, 'Unauthorized action.');

Reportable & Renderable 异常

除了在异常处理器的 reportrender 方法中检查异常类型,你还可以直接在自定义异常上定义 reportrender 方法。当定义了这些方法时,它们会被框架自动调用:

<h2>{{ $exception->getMessage() }}</h2>

{tip} 你可以声明 report 方法和必要参数,它们将通过 Laravel 的 服务容器 自动注入方法中

HTTP 异常

一些异常用于描述产生自服务器的 HTTP 错误代码。例如,「页面未找到」错误 (404),  「未经授权的错误」(401) ,甚至可以是开发人员引起的 500 错误。 你可以使用 abort 辅助函数从应用程序的任何地方生成这样的响应:

php artisan vendor:publish --tag=laravel-errors

辅助函数 abort 会立即引发一个由异常处理器渲染的异常。你还可选择性地提供响应文本:

rrreee

自定义 HTTP 错误页面

Laravel 可以轻松显示各种 HTTP 状态代码的自定义错误页面。例如,如果你希望自定义 404 HTTP 状态码的错误页面,可以创建一个 resources/views/errors/404.blade.php 视图文件。该文件将被用于你的应用程序产生的所有 404 错误。此目录中的视图文件的命名应匹配它们对应的 HTTP 状态码。由 abort 函数引发的 HttpException 实例将作为 $exception 变量传递给视图:

rrreee

你可以使用 vendor:publishrrreee

Pengecualian Boleh Dilaporkan & Boleh Diserahkan
🎜Selain menyemak jenis pengecualian dalam kaedah laporan dan render pengendali pengecualian, anda juga boleh mentakrifkan laporan< terus pada kaedah pengecualian tersuai /code> dan render. Apabila kaedah ini ditakrifkan, kaedah ini akan dipanggil secara automatik oleh rangka kerja: 🎜rrreee
🎜{tip} Anda boleh mengisytiharkan kaedah report dan parameter yang diperlukan, dan ia akan disuntik secara automatik ke dalam kaedah melalui bekas perkhidmatan Laravel 🎜
🎜🎜🎜
🎜

HTTP Exceptions

🎜Sesetengah pengecualian digunakan untuk menerangkan kejadian kod ralat HTTP daripada pelayan. Contohnya, ralat "Halaman Tidak Ditemui" (404), "Ralat Tidak Dibenarkan" (401), atau bahkan 500 ralat yang disebabkan oleh pembangun. Anda boleh menggunakan fungsi pembantu abort untuk menjana respons seperti ini dari mana-mana sahaja dalam aplikasi anda: 🎜rrreee🎜Fungsi helper abort serta-merta menimbulkan pengecualian yang diberikan oleh pengendali pengecualian. Anda juga boleh memberikan teks respons secara pilihan: 🎜rrreee🎜
🎜🎜
🎜🎜Halaman Ralat HTTP Tersuai🎜🎜 Laravel boleh memaparkan halaman ralat tersuai dengan mudah untuk pelbagai kod status HTTP. Contohnya, jika anda ingin menyesuaikan halaman ralat untuk kod status HTTP 404, anda boleh mencipta fail paparan resources/views/errors/404.blade.php. Fail ini akan digunakan untuk semua 404 ralat yang dijana oleh aplikasi anda. Lihat fail dalam direktori ini harus dinamakan untuk memadankan kod status HTTP yang sepadan. Kejadian HttpException yang dibangkitkan oleh fungsi abort akan dihantar ke paparan sebagai pembolehubah $exception: 🎜rrreee🎜Anda boleh menggunakan vendor:publish< /code> Perintah Artisan untuk mentakrifkan halaman templat ralat. Selepas halaman templat dijana, anda boleh menyesuaikan kandungan halaman templat: 🎜rrreee🎜Artikel ini pertama kali diterbitkan di laman web 🎜LearnKu.com🎜. 🎜🎜