当前位置: 首页 > news >正文

视频网站VIP卡怎么做赠品/点击器免费版

视频网站VIP卡怎么做赠品,点击器免费版,办公室装修设计方案范本,做电商网站要服务器吗错误与异常错误和异常 在PHP 中不一样的, 它们都表明代码出现问题, 且都能提供错误信息.Points:错误 出现的时机比异常早错误 可以委托给全局错误处理器处理, 有些错误是无法恢复的, 会导致脚本停止异常 要先实例化(Exception类), 然后抛出, 可以被捕获(try...catch)异常 捕获后…

错误与异常

错误异常 在PHP 中不一样的, 它们都表明代码出现问题, 且都能提供错误信息.

Points:

  • 错误 出现的时机比异常早
  • 错误 可以委托给全局错误处理器处理, 有些错误是无法恢复的, 会导致脚本停止
  • 异常 要先实例化(Exception类), 然后抛出, 可以被捕获(try...catch)
  • 异常 捕获后可以就地处理, 无需停止脚本(任何未被捕获的异常都会导致脚本停止)

异常的使用:

  • 主动出击: 在遇到无法修复的状况时(当前上下文不知道如何处理)主动抛出, 交由使用者处理
    eg. 数据库连接超时, 传入参数类型不符合条件等.
    eg. 组件和框架的作者尤其无法确定如何处理异常状况, 通常会抛出异常, 交由具体使用者去处理.
  • 被动防守: 预测潜在的问题, 减轻影响(将可能抛出异常的代码放在 try/catch 块中)

PHP 7 注意:

PHP 7中, 大多数错误被作为 Error异常 抛出, 能够被捕获.

若未被捕获且未注册异常处理函数(通过 set_exception_handler() 注册), 则会按照传统方式处理(指PHP7之前版本): 被报告为一个致命错误(Fatal Error), 可被 set_error_handler() 处理.

异常类

PHP 内置异常类:

  • Exception
  • ErrorException

SPL 扩充的异常类(均继承自 Exception 类):

  • LogicException
  • BadFunctionCallException
  • BadMethodCallException
  • DomainException
  • InvalidArgumentException
  • LengthException
  • OutOfRangeException
  • RuntimeException
  • OutOfBoundsException
  • OverflowException
  • RangeException
  • UnderflowException
  • UnexpectedValueException

错误类(PHP >= 7)

  • Throwable
  • Error
  • ArithmeticError
  • DivisionByZeroError
  • AssertionError
  • ParseError
  • TypeError
  • Exception
  • ...

注意: PHP 7 中, Error 和 Exception 都继承自 Throwable, 因此在捕获(try...catch)时可通过捕获 Throwable 来同时捕获异常和错误

try {// do something
} catch (Throwable $e) {// log error or sth.
}

错误

php 能触发不同类型的错误:

  • 致命错误
  • 运行时错误
  • 编译时错误
  • 启动错误
  • 用户触发错误(少见)

错误报告级别

error_reporting(int $level);
PHP 5.3 及以上, 默认的错误报告级别是 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(不会显示 E_NOTICEE_STRICTE_DEPRECATED)PHP Manual 所有的错误级别

部分错误级别解释:

e300fe01909723748cdf98a6b43df63b.png

错误报告设置

错误报告遵循原则

  • 报告错误
  • 开发环境要显示错误
  • 生产环境要不能显示错误(安全考虑)
  • 开发环境和生产环境都要记录错误
注意分清 报告错误显示错误 这两个概念的区别.

php.ini

开发环境推荐错误报告方式

;显示错误
display_startup_errors = On
display_errors = On;报告错误
error_reporting = -1;记录错误
log_errors = On

生产环境推荐错误报告方式

;显示错误
display_startup_errors = Off
display_errors = Off;报告错误
error_reporting = E_ALL & ~E_NOTICE;记录错误
log_errors = On

部分参数解释

952315fc0460843609be4d9066ae725f.png

范例代码

<?php// 关闭所有PHP错误报告
error_reporting(0);// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);// 报告 E_NOTICE也挺好 (报告未初始化的变量
// 或者捕获变量名的错误拼写)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);// 除了 E_NOTICE,报告其他所有错误
error_reporting(E_ALL ^ E_NOTICE);// 报告所有 PHP 错误 (参见 changelog)
error_reporting(E_ALL);// 报告所有 PHP 错误
error_reporting(-1);// 和 error_reporting(E_ALL); 一样
ini_set('error_reporting', E_ALL);?>

全局异常处理程序

捕获所有未被捕获的异常: 通过 set_exception_handler 注册全局异常处理程序.

函数

set_exception_handler ( callable $exception_handler ) : callable
// 注册异常处理程序
set_exception_handler('handleException');// 重置异常处理程序为默认值
// set_exception_handler(null);// 还原成之前的异常处理程序
// restore_exception_handler();// < PHP 7
handleException(Exception $ex)
{// 记录错误日志echo "Uncaught exception: " , $ex->getMessage(), "n";// 开发环境显示调试信息(推荐 filp/whoops 扩展包)// ...// 生产环境显示对用户友好的页面(信息)// ...}// >= PHP 7
// 大多数错误抛出 Error 异常, 也能被捕获, 因此参数类型必须是 Throwable, 否则会引起问题.
handleException(Throwable $ex)
{// ...
}

在用户自定义异常处理函数内部, 可根据情况做一下处理:

  • 日志记录错误
  • web 渲染错误页面
  • console 渲染错误提示

全局错误处理函数

通过设置全局错误处理程序, 使用自己的自定义方式拦截并处理PHP错误, 包括但不限于:

  • 记录详细错误日志
  • 对数据/文件做清理回收
  • 转换成 ErrorException 对象, 再由处理异常的流程来处理错误.

注册全局错误处理程序

set_error_handler( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

$error_types 指定的错误类型会被该错误处理函数拦截 ( 除非该函数返回了 false),不受 error_report() 影响.

处理程序

# 错误处理函数参数
# $errno 错误等级(对应 E_* 常量)
# $errstr 错误消息
# $errfile 发生错误的文件名
# $errline 发生错误的行号
# $errcontext 一个数组, 指向错误发生时可用的符号表(可选参数), 通常不用(php7.2后废弃)
function error_handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext) {// 处理错误
}
带 @ 前缀的语句发生错误时, $errno 值为 0
  • 脚本会在错误处理函数结束后从出错的地方继续执行 (因此必要时需主动调用 die()exit() 以结束脚本)
  • 如果错误发生在脚本执行之前(比如文件上传时),将不会 调用自定义的错误处理程序因为它尚未在那时注册。
  • 如果函数返回 FALSE,标准错误处理处理程序将会继续调用。

无法捕获的错误类型

以下级别的错误不能由用户定义的错误处理函数来捕获:

bc83ba99cf66421b9f296381fb5c6489.png

以及在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT

这些无法捕获的错误, 可在 register_shutdown_function() 中处理( 但脚本仍会结束 )

范例代码

function handleError($errno, $errstr, $errfile = '', $errline = 0)
{if (!(error_reporting() & $errno)) {// 错误类型未包含在 error_reporting() 里, 因此将它交由PHP标准错误处理程序来处理return false;}throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

错误 转换为 异常

开发/生产环境处理错误和异常

开发环境

php 默认的错误信息很糟糕, 为了更高的帮助调试程序, 可以使用 filp/whoops 扩展包.

安装

composer require filp/whoops

使用(web)

$whoops = new WhoopsRun;
$whoops->pushHandler(new WhoopsHandlerPrettyPageHandler);
$whoops->register();

如果php脚本触发PHP错误, 或应用没有捕获异常, 则开发人员就可以看到 Whoops 的图形化诊断页面.

可用的处理器

  • PrettyPageHandler - 显示美观的web页面显示错误信息
  • PlainTextHandler - 用于命令行程序时输出纯文本信息
  • CallbackHandler - 将闭包或其他可调用包装为处理程序
  • JsonResponseHandler - 捕获异常, 并以 JSON 字符串形式返回, 比如用于 AJAX 请求
  • XmlResponseHandler - 捕获异常, 但是是以XML格式字符串返回

生产环境

记录错误信息通常使用 error_log() 函数以将错误信息记录到文件系统或syslog.

error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) : boolmessage_type 参数, 设置错误应该发送到何处。可能的信息类型有以下几个:

ec5abf9884e073c26fca41d714d4fa09.png

一个更好的选择是使用 monolog/monolog 扩展包

<?php
require "vendor/autoload.php";use MonologLogger;
use MonologHandlerStreamHandler;// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));// add records to the log
$log->warning('Foo');
$log->error('Bar');

示例: 在生产环境中使用 Monolog 记录日志, 严重错误使用邮件通知

依赖: swiftmailer/swiftmailer
require "vendor/autoload.php";use MonologLogger;
use MonologHandlerStreamHandler;
use MonologHandlerSwiftMailerHandler;date_default_timezone_set('Asia/Shanghai');// 设置monolog
$logger = new Logger('my-app-name');
$logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));// 添加SwiftMailer Handler, 遇到严重错误时使用邮件通知
// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.example.org', 25))->setUsername('your username')->setPassword('your password');// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);// Create a message
$message = (new Swift_Message('Wonderful Subject'))->setFrom(['john@doe.com' => 'John Doe'])->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']);$logger->pushHandler(new SwiftMailerHandler($mailer, $message, Logger::CRITICAL));// 使用日志记录器
$logger->critical('The server is on fire!');

php中止时的回调函数

register_shutdown_function

register_shutdown_function(function () {// do sth...
}, $para1, $param2, ...)

注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

Note:

  • 可注册多个回调函数(不会互相覆盖, 依照注册顺序依次调用), 在php脚本中止时会被调用到.
  • 如果在注册的方法内部调用 exit(), 那么所有处理会被中止,并且其他注册的中止回调也不会再被调用。

由于部分错误无法被 set_error_handler 捕获, 因此需配合 register_shutdown_function, 判断脚本退出的原因, 若是因为未被捕获的致命错误, 则需要处理(日志记录等)

register_shutdown_function('handleShutdown');function handleShutdown()
{// 如果是因为严重错误(未被捕获)导致脚本退出, 则需要处理(作为对 set_error_handler的补充)if (! is_null($error = error_get_last()) && isFatal($error['type'])) {// handleException() 函数同时处理 set_exception_handlerhandleException(new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line'],));}
}function isFatal($type)
{// 以下错误无法被 set_error_handler 捕获: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNINGreturn in_array($type, [E_COMPILE_ERROR, E_CORE_ERROR, E_ERROR, E_PARSE]);
}

Note:

进程被信号 SIGTERM 或 SIGKILL 杀死时中止函数不会被调用. 可通过 pcntl_signal 捕获信号, 再在其中调用 exit() 来进行正常中止.

http://www.lbrq.cn/news/957727.html

相关文章:

  • 手机制作网站软件/宁波网站推广怎么做
  • 新乡新手学做网站/网络营销技巧培训
  • 山东法院网站哪个公司做的/流量网站
  • 建设网站价钱/sem优化公司
  • 做电影网站涉及的侵权问题/中文搜索引擎
  • 安徽建设网站公司/seo免费推广软件
  • 网站开发留学/快速提升网站排名
  • 网站维护技术/外链发布平台
  • 苹果软件做ppt下载网站有哪些/网络推广平台代理
  • 十堰秦楚网 十堰新闻门户网站/账户竞价托管哪里好
  • 大庆油田app下载安装官方版/seo发包排名软件
  • 网站源码上传/惠州自动seo
  • 外贸网站代运营/搜索优化网络推广
  • 学校网站制作模板/西安网站制作价格
  • app网站怎么下载/博客推广的方法与技巧
  • 宜昌教育培训网站建设/优化设计单元测试卷
  • 长沙做网站开发价格/成都百度推广联系方式
  • 导购网站自己做电商/网站模板平台资源
  • ghostwin8网站奖别人做/长春头条新闻今天
  • 做户外运动的网站/青岛seo招聘
  • 网站建设需要什么基础/软文广告经典案例200字
  • 美工免费素材网站/seo是什么意思为什么要做seo
  • 网站建设介绍怎么写/可以看任何网站的浏览器
  • wordpress 导出菜单/宁波网站推广优化公司电话
  • 腾讯文件怎么转换wordpress/兰州搜索引擎优化
  • 怎么查询网站是否收录/seo公司上海牛巨微
  • 如何做电商网站测试/网站百度推广
  • 长沙做网站seo/产品推广策略
  • 淘宝网站设计公司/营销存在的问题及改进
  • 旅游手机网站模板/交换链接或称互惠链接
  • 【Linux】如何理解 “一切皆文件”
  • 在非Spring Boot的Spring项目中使用Lock4j
  • 安全事件响应分析--基础命令
  • 【2025/07/19】GitHub 今日热门项目
  • Excel批量生成SQL语句 Excel批量生成SQL脚本 Excel拼接sql
  • mac mlx大模型框架的安装和使用