laravel中有哪些异常

laravel中的异常有:1、“E_ERROR”致命运行时错误,不可恢复,会导致脚本终止不再继续运行;2、“E_WARNING”运行时警告“非致命错误”;3、“E_PARSE”编译时语法解析错误;4、“E_CORE_ERROR”初始化启动过程中发生的致命错误;5、“E_COMPILE_ERROR”致命编译时错误;6、“E_RECOVERABLE_ERROR”可被捕捉的致命错误。

laravel中有哪些异常

本教程操作环境:windows7系统、Laravel9版,DELL G3电脑。

laravel中的异常级别

常量 说明

E_ERROR致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。E_WARNING运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。E_PARSE编译时语法解析错误。解析错误仅仅由分析器产生。E_NOTICE运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。E_CORE_ERROR在 PHP 初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由 PHP 引擎核心产生的。E_CORE_WARNINGPHP 初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由 PHP 引擎核心产生的。E_COMPILE_ERROR致命编译时错误。类似 E_ERROR, 但是是由 Zend 脚本引擎产生的。E_COMPILE_WARNING编译时警告 (非致命错误)。类似 E_WARNING,但是是由 Zend 脚本引擎产生的。E_USER_ERROR用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。E_USER_WARNING用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。E_USER_NOTICE用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。E_STRICT启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。E_RECOVERABLE_ERROR可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致 PHP 引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler ()),将成为一个 E_ERROR 从而脚本会终止运行。E_DEPRECATED运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。E_USER_DEPRECATED用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。E_ALL用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用 PHP 函数 trigger_error () 来产生的。

Laravel 异常处理

laravel 的异常处理由类 IlluminateFoundationBootstrapHandleExceptions::class 完成:

class HandleExceptions{    public function bootstrap(Application $app)    {        $this->app = $app;        error_reporting(-1);        set_error_handler([$this, 'handleError']);        set_exception_handler([$this, 'handleException']);        register_shutdown_function([$this, 'handleShutdown']);        if (! $app->environment('testing')) {            ini_set('display_errors', 'Off');        }    }}

异常转化

laravel 的异常处理均由函数 handleException 负责。

PHP7 实现了一个全局的 throwable 接口,原来的 Exception 和部分 Error 都实现了这个接口, 以接口的方式定义了异常的继承结构。于是,PHP7 中更多的 Error 变为可捕获的 Exception 返回给开发者,如果不进行捕获则为 Error ,如果捕获就变为一个可在程序内处理的 Exception。这些可被捕获的 Error 通常都是不会对程序造成致命伤害的 Error,例如函数不存在。

PHP7 中,基于 /Error exception,派生了 5 个新的 engine exception:ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError。在 PHP7 里,无论是老的 /Exception 还是新的 /Error ,它们都实现了一个共同的 interface: /Throwable。

因此,遇到非 Exception 类型的异常,首先就要将其转化为 FatalThrowableError 类型:

public function handleException($e){    if (! $e instanceof Exception) {        $e = new FatalThrowableError($e);    }    $this->getExceptionHandler()->report($e);    if ($this->app->runningInConsole()) {        $this->renderForConsole($e);    } else {        $this->renderHttpResponse($e);    }}

FatalThrowableError 是 Symfony 继承 ErrorException 的错误异常类:

有道小P 有道小P

有道小P,新一代AI全科学习助手,在学习中遇到任何问题都可以问我。

有道小P 64 查看详情 有道小P

class FatalThrowableError extends FatalErrorException{    public function __construct(Throwable $e)    {        if ($e instanceof ParseError) {            $message = 'Parse error: '.$e->getMessage();            $severity = E_PARSE;        } elseif ($e instanceof TypeError) {            $message = 'Type error: '.$e->getMessage();            $severity = E_RECOVERABLE_ERROR;        } else {            $message = $e->getMessage();            $severity = E_ERROR;        }        ErrorException::__construct(            $message,            $e->getCode(),            $severity,            $e->getFile(),            $e->getLine()        );        $this->setTrace($e->getTrace());    }}

异常 Log

当遇到异常情况的时候,laravel 首要做的事情就是记录 log,这个就是 report 函数的作用。

protected function getExceptionHandler(){    return $this->app->make(ExceptionHandler::class);}

laravel 在 Ioc 容器中默认的异常处理类是 IlluminateFoundationExceptionsHandler:

class Handler implements ExceptionHandlerContract{    public function report(Exception $e)    {        if ($this->shouldntReport($e)) {            return;        }        try {            $logger = $this->container->make(LoggerInterface::class);        } catch (Exception $ex) {            throw $e; // throw the original exception        }        $logger->error($e);    }    protected function shouldntReport(Exception $e)    {        $dontReport = array_merge($this->dontReport, [HttpResponseException::class]);        return ! is_null(collect($dontReport)->first(function ($type) use ($e) {            return $e instanceof $type;        }));    }}

异常页面展示

记录 log 后,就要将异常转化为页面向开发者展示异常的信息,以便查看问题的来源:

protected function renderHttpResponse(Exception $e){    $this->getExceptionHandler()->render($this->app['request'], $e)->send();}class Handler implements ExceptionHandlerContract{    public function render($request, Exception $e)    {        $e = $this->prepareException($e);        if ($e instanceof HttpResponseException) {            return $e->getResponse();        } elseif ($e instanceof AuthenticationException) {            return $this->unauthenticated($request, $e);        } elseif ($e instanceof ValidationException) {            return $this->convertValidationExceptionToResponse($e, $request);        }        return $this->prepareResponse($request, $e);    }}

对于不同的异常,laravel 有不同的处理,大致有 HttpException、HttpResponseException、AuthorizationException、ModelNotFoundException、AuthenticationException、ValidationException。由于特定的不同异常带有自身的不同需求,本文不会特别介绍。本文继续介绍最普通的异常 HttpException 的处理:

protected function prepareResponse($request, Exception $e){    if ($this->isHttpException($e)) {        return $this->toIlluminateResponse($this->renderHttpException($e), $e);    } else {        return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);    }}protected function renderHttpException(HttpException $e){    $status = $e->getStatusCode();    view()->replaceNamespace('errors', [        resource_path('views/errors'),        __DIR__.'/views',    ]);    if (view()->exists("errors::{$status}")) {        return response()->view("errors::{$status}", ['exception' => $e], $status, $e->getHeaders());    } else {        return $this->convertExceptionToResponse($e);    }}

对于 HttpException 来说,会根据其错误的状态码,选取不同的错误页面模板,若不存在相关的模板,则会通过 SymfonyResponse 来构造异常展示页面:

protected function convertExceptionToResponse(Exception $e){    $e = FlattenException::create($e);    $handler = new SymfonyExceptionHandler(config('app.debug'));    return SymfonyResponse::create($handler->getHtml($e), $e->getStatusCode(), $e->getHeaders());}protected function toIlluminateResponse($response, Exception $e){    if ($response instanceof SymfonyRedirectResponse) {        $response = new RedirectResponse($response->getTargetUrl(), $response->getStatusCode(), $response->headers->all());    } else {        $response = new Response($response->getContent(), $response->getStatusCode(), $response->headers->all());    }    return $response->withException($e);}

【相关推荐:laravel视频教程】

以上就是laravel中有哪些异常的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/341012.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 18:14:14
下一篇 2025年11月5日 18:20:24

相关推荐

  • php将对象变成数组输出_php对象转数组格式化技巧【指南】

    PHP对象转数组有五种方法:一、类型强制转换,仅支持公有属性;二、get_object_vars()函数,只返回可访问公有属性;三、自定义递归toArray()方法,通过反射访问所有属性并递归处理嵌套对象;四、JSON编解码,要求属性可序列化且无资源等类型;五、Laravel Collection辅…

    2025年12月13日
    000
  • 在Laravel中使用Dompdf生成带数据PDF的完整指南

    本教程详细介绍了如何在laravel应用中利用dompdf包从数据库生成包含动态数据的pdf文件。文章重点讲解了`loadview`方法的正确用法、数据传递机制以及如何构建相应的blade视图模板,并提供了解决pdf内容为空问题的实用排查建议,确保您能成功生成结构完整、数据丰富的pdf文档。 Lar…

    2025年12月13日
    000
  • 使用PHP从MySQL获取多张表数据并结构化为JSON的教程

    本教程详细介绍了如何使用php连接mysql数据库,执行多条sql查询以获取不同表的数据,然后将这些数据分别收集到php数组中,并最终整合成一个统一的关联数组,通过`json_encode`函数将其转换为结构化的json格式输出。这为前端应用提供了一种高效的数据接口实现方式。 引言 在现代Web应用…

    2025年12月13日
    000
  • Laravel多语言路由:通过路由组和中间件实现Locale前缀的自动化管理

    本文详细介绍了如何在laravel多语言网站中,通过结合路由组的`prefix(‘{locale}’)`和自定义中间件,实现所有路由的语言环境(locale)前缀自动化管理。这种方法不仅简化了url结构,使得语言信息成为url的固有部分,还确保了应用程序能够根据请求路径自动识…

    2025年12月13日
    000
  • 在 Laravel 8 中优雅地定义和复用全局验证规则

    在 laravel 8 中,开发者常常希望能够集中管理和复用应用程序中的验证规则,以避免重复代码并提高可维护性。然而,直接尝试将包含复杂表达式(例如 `rule::in` 或其他动态生成规则)的验证规则数组定义为类的静态属性时,会遇到 php 的一个限制:静态属性只能使用字面量或常量进行初始化,不能…

    2025年12月13日
    000
  • 如何在Laravel嵌套函数中优雅地抛出验证失败响应

    在Laravel应用程序开发中,我们经常需要对用户输入进行验证。Laravel内置的`request()->validate()`方法在验证失败时,会自动抛出一个`ValidationException`,并由框架的异常处理器捕获,最终向前端(特别是AJAX请求)返回一个HTTP 422状态码…

    2025年12月13日
    000
  • 在Docker多阶段构建中为Laravel应用定制Composer的PHP版本

    本文探讨了在docker多阶段构建中,如何解决composer镜像默认php版本与laravel应用依赖不兼容的问题。文章提供了三种解决方案:使用特定版本的composer镜像、基于alpine手动安装php,以及推荐的基于明确php版本镜像安装composer。旨在帮助开发者优化镜像大小、确保应用…

    2025年12月13日
    000
  • php数组怎么添加数据库中_PHP数组数据添加到数据库操作

    需将PHP数组转为SQL语句再插入数据库,常用方式有五种:一、PDO预处理批量插入;二、mysqli逐条插入;三、JSON编码存TEXT字段;四、ORM框架如Eloquent批量写入;五、LOAD DATA INFILE导入CSV。 如果需要将PHP数组中的数据插入数据库,必须先将数组结构转换为可执…

    2025年12月13日
    000
  • Laravel模型中实现多语言数据自动过滤:重写newQuery()方法

    本教程详细介绍在laravel多语言应用中,如何通过重写模型(model)的`newquery()`方法,实现数据查询时自动根据当前应用语言环境进行过滤。这种方法提供了一种优雅且dry(don’t repeat yourself)的解决方案,避免了在每次数据查询时手动添加语言条件,确保了…

    2025年12月13日
    000
  • Laravel批量创建模型后转换为数组的toArray()方法调用指南

    本文旨在解决在laravel中批量创建eloquent模型后,尝试将这些模型集合转换为数组时常见的`toarray()`方法调用错误。我们将深入分析问题根源,并提供一个使用`collect()`辅助函数结合eloquent模型和collection的`toarray()`方法的高效解决方案,确保数据…

    2025年12月13日
    000
  • Laravel表单中动态日期范围处理与多操作提交指南

    本教程旨在解决laravel应用中,如何在一个表单内有效捕获动态日期范围(如`start_date`和`end_date`),并将其传递给不同的操作(如“搜索”和“打印”)。文章将详细介绍通过优化前端视图层和后端控制器逻辑,利用多提交按钮机制,确保所有表单数据都能正确提交并被控制器识别,从而实现灵活…

    2025年12月13日
    000
  • Laravel数据加密与解密:实现可逆敏感信息存储的教程

    在开发需要存储敏感信息(如密码管理器中的服务凭据)的应用时,如何在保证数据安全的同时实现可逆的存储与检索是一个常见挑战。本文将深入探讨Laravel框架提供的加密服务,指导您如何使用`Crypt` facade对字符串进行加密和解密,从而安全地存储那些需要原文显示的敏感数据,并强调其与一次性哈希的区…

    2025年12月13日
    000
  • PHP Twig模板引擎入门指南_PHP使用Twig渲染视图流程

    PHP中使用Twig渲染视图核心三步:安装Twig(推荐Composer)、创建.html.twig模板、PHP中用FilesystemLoader和Environment加载渲染;支持缓存、模板继承与自动转义,轻量灵活且安全。 PHP 中使用 Twig 渲染视图,核心就三步:安装 Twig、创建模…

    2025年12月13日
    000
  • 在 Laravel 中实现 exists 规则的多字段 OR 条件验证

    本教程详细探讨了在 laravel 框架中,如何为 `exists` 验证规则实现多字段 `or` 条件查询。鉴于 laravel 内置 `exists` 规则不直接支持 `or` 逻辑,文章提供了两种主要解决方案:一是基于输入特征的动态条件验证,二是创建自定义验证规则。通过具体代码示例和注意事项,…

    2025年12月13日
    000
  • Laravel 路由中实现 ‘/me’ 的用户模型绑定策略

    本文探讨在 laravel 应用中如何为当前登录用户实现自定义的路由模型绑定,允许使用 `/users/me/posts` 替代传统的 `/users/{id}/posts`。我们将介绍两种主要方法:通过路由分组和控制器可选参数进行处理,以及通过重写模型中的 `resolveroutebinding…

    2025年12月13日
    000
  • php框架的整理和补充

    选型应匹配项目需求,Laravel适合中大型应用,Symfony适合企业级定制,CodeIgniter和ThinkPHP适合小型或快速上线项目,需关注自动加载、日志分级、迁移分离、中间件顺序及微框架灵活使用,合理优化才能稳定支撑迭代。 PHP框架的选择和使用,关键不在数量多,而在是否匹配项目需求、团…

    2025年12月13日
    000
  • 使用Docker容器化Laravel与PostgreSQL的完整教程

    本教程详细指导如何利用docker和docker compose容器化laravel应用程序与postgresql数据库。文章涵盖了优化的dockerfile配置,用于构建laravel应用镜像;以及一份完整的docker-compose.yml文件,用于编排laravel应用、postgresql…

    2025年12月13日
    000
  • Dompdf生成动态PDF:确保视图与数据正确加载

    在使用Dompdf生成PDF时,有时会遇到PDF文件为空,无法显示数据库数据的问题。这通常是由于loadView()方法中视图路径配置不当或数据未正确传递到Blade模板所致。本文将深入探讨Dompdf的工作原理,提供详细的解决方案和代码示例,指导您正确加载视图并传递数据,从而生成包含动态内容的PD…

    2025年12月13日
    000
  • 使用Docker容器化Laravel与PostgreSQL:完整实践指南

    本教程旨在提供一个使用docker容器化%ignore_a_1%应用与postgresql数据库的完整指南。我们将详细介绍如何配置dockerfile以构建php-fpm服务,集成composer和node.js,并创建docker-compose.yml文件来编排laravel应用容器和postg…

    2025年12月13日
    000
  • Laravel中基于用户认证状态与用户角色安全地控制UI元素显示

    本文详细介绍了在Laravel应用中,如何根据用户的认证状态(访客或已登录)以及已登录用户的特定角色,安全且高效地控制前端UI元素的显示与隐藏。文章将重点解决直接访问`auth()->user()`可能导致的空指针错误,并提供一个健壮的条件判断解决方案,确保无论用户是否登录,应用都能正常运行并…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信