在PHP7.4.0中,我看到了以下警告:已弃用:带有大括号的数组和字符串偏移量访问语法已弃用…
我的错误/异常处理程序无法捕获并记录它们。
示例:
<?php
set_error_handler(function ($errNo, $errStr) {
echo "set_error_handler: " . $errStr;
});
set_exception_handler(function ($exception) {
echo "set_exception_handler: " . $exception->getMessage();
});
$b = 'test';
$a = $b{1};
警告仍显示在正常输出中,并且两个处理程序均未调用。
我想在自己的日志中记录所有错误、异常和警告,但处理程序无法捕获此警告。是否有这样的原因或解决方案来捕获并记录PHP抱怨的所有内容(无法访问服务器Apache/PHP日志)?
set_error_handler
捕获在运行时发出的消息,每个文档:
此函数可用于定义自己在运行时处理错误的方式
您看到的弃用警告是在编译时实现的,根据定义,它发生在运行时之前:
static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
{
if (ast->attr == ZEND_DIM_ALTERNATIVE_SYNTAX) {
zend_error(E_DEPRECATED, "Array and string offset access syntax with curly braces is deprecated");
}
...
您可能会认为这是一个“软语法错误”:它是在解析时发现的,在编译步骤中发现的,但它不是一个致命的问题,而是对未来厄运的警告。与语法错误一样,有两种处理方法:预处理和关闭处理。
$ cat error-handler.php
<?php
set_error_handler(fn(...$args) => var_dump($args));
$ cat try.php
<?php
$b = 'test';
$a = $b{1};
$ php -d auto_prepend_file=error-handler.php try.php
array(5) {
[0]=>
int(8192)
[1]=>
string(69) "Array and string offset access syntax with curly braces is deprecated"
[2]=>
string(21) "/Users/bishop/try.php"
[3]=>
int(3)
[4]=>
NULL
}
register_shutdown_function(fn() => var_dump(error_get_last()));
$b = 'test';
$a = $b{1};
输出:
array(4) {
["type"]=>
int(8192)
["message"]=>
string(69) "Array and string offset access syntax with curly braces is deprecated"
["file"]=>
string(9) "/in/212CF"
["line"]=>
int(7)
}
根据您的需要,选择其中之一或两者。就我个人而言,我使用预置方法,因为它处理各种其他白色屏幕的死亡场景。如果您在Web上下文中这样做,您需要安排您的Web服务器设置auto_prepend_file
设置:一旦您的“主”代码运行,您就不能像这里演示的那样设置前置并让它工作。
问题内容: 我开始学习Python,并且编写了一个非常简单的代码来练习try / except。 这是代码: 每当我输入字母作为数字时,除了的打印效果良好,但代码崩溃。 &正在工作,但没有。 我什至将输入放在单独的try / except中,但仍然无法正常工作。 我该如何在实际应用中处理此错误? 问题答案: 在您进入try块之前发生崩溃。如果您输入带有当前代码的字母,它不会在except块中打印错
问题内容: 在我的python脚本中,我想使用MySql捕获“我的查询截断了列’xxx’的数据”警告。 我看到了一些建议以下代码的帖子,但它不起作用。 您是否知道在使用此代码之前是否必须导入某些特定模块或是否应调用某些选项/标志? 谢谢大家 阿菲格 问题答案: 警告仅仅是:警告。他们被报告给(通常)stderr,但是没有做其他事情。您不能像异常一样捕获它们,因为它们没有被引发。 你可以,但是,配置
问题内容: 我正在使用react-navigation实现2个屏幕。但是导航到第二页时出现以下警告: 警告:isMounted(…)在纯Javascript类中已弃用。相反,请确保在componentWillUnmount中清除订阅和未决请求,以防止内存泄漏。 版本: 反应:16.3.1 反应本机:0.55.2 反应导航:1.5.11 效用:0.10.3 Login.js Home.js 我在这里
问题内容: 我正在尝试捕获“ android.database.sqlite.SQLiteException:错误代码5:数据库已锁定”异常,并带有: 由于某些原因,我仍然会收到错误消息,并且LogCat中没有显示“ caught”。我尝试捕获一般的“异常”,但这仍然行不通。怎么了? 更新, 我发现了这个问题,这确实很奇怪:由于某种原因,将goto10声明的db.insert()更改为db.ins
问题内容: 尽管我在日志中看到了异常,但似乎无法捕获到约束违例异常。 实体 我正试图抓住它 -它永远不会到达捕获块。 当我使用 捕获(异常e) 我捕获到“ javax.transaction.RollbackException:ARJUNA016053:无法提交事务。” 这是错误日志: 我究竟做错了什么 ? 更新>> 我当前的代码是: 日志是 环境:PostgreSQL 9.2 JBoss AS
我使用的是Spring Boot 2和Spring Boot starter数据jpa以及底层的MariaDB。 我有一个带有唯一键“用户名”的表。如果违反了此约束,我想捕获,但似乎Spring正在记录并且不会在记录后重新抛出(我最好的猜测)。被抛出。 我想在中捕获。 以下是几段代码片段: 堆栈跟踪: