error_get_last() 和自定义错误处理程序

2023-11-26

odbc_errormsg不报告错误消息odbc_execute就像它应该的那样。它只是发出警告。所以我被迫编写一个 hack 来解析错误消息error_get_last.

我在用着set_error_handler and error_get_last回报NULL除非我:

  1. 禁用我的错误处理程序,

  2. 或者让它返回FALSE.

我认为这是由于 PHP 的内置错误处理程序负责将错误详细信息存储在某处,以便以后可以检索它们。

有没有办法在我的自定义错误处理程序中模拟这种行为error_get_last()可以正常使用吗?

请注意,我已经知道几种随时检索错误信息的方法。我的问题是如何制作error_get_last usable.


Update:我想我最好发布一些代码。

PHP has error_get_last(),它允许这样做:

@fopen('xxx');
var_dump( error_get_last() );

...并得到这个:

array(4) {
  ["type"]=>
  int(2)
  ["message"]=>
  string(46) "fopen() expects at least 2 parameters, 1 given"
  ["file"]=>
  string(69) "C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php"
  ["line"]=>
  int(3)
}

如果您替换内置错误处理程序,则会中断:

function custom_error_handler($errno, $errstr, $errfile, $errline){
    $ignore = ($errno & error_reporting()) == 0;
    if(!$ignore){
        echo "[Error happened: $errstr]\n";
    }
    return TRUE;
}
set_error_handler('custom_error_handler');

@fopen('xxx');
var_dump( error_get_last() ); // NULL

如果您保留两个错误处理程序...

function custom_error_handler($errno, $errstr, $errfile, $errline){
    $ignore = ($errno & error_reporting()) == 0;
    if(!$ignore){
        echo "[Error happened: $errstr]\n";
    }
    return FALSE;
}
set_error_handler('custom_error_handler');

error_reporting(E_ALL);
echo $foo;

...你会产生副作用:

[Error happened: Undefined variable: foo]

Notice: Undefined variable: foo in C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php on line 15

Call Stack:
    0.0004     329720   1. {main}() C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php:0

...而不仅仅是:

[Error happened: Undefined variable: foo]

我希望我的自定义错误处理程序能够正确地与error_get_last。我想error_get_last工作顺利。


是的,这是一个奇怪的解决方案,但我think它将适合您的目的。

经过一番尝试后,我发现:

function my_error_handler ($errno, $errstr, $errfile = '', $errline = 0, $errcontext = array()) {

  // Handle the error here

  @trigger_error($errstr);
  return TRUE;

}

// Just to make sure PHP is not outputting anything
error_reporting(-1);
ini_set('display_errors',1);

set_error_handler('my_error_handler');

// An E_USR error...
trigger_error('Some error');
var_dump(error_get_last());

// ...and a native one
$key = count();
var_dump(error_get_last());

结果如下:

array(4) {
  ["type"]=>
  int(1024)
  ["message"]=>
  string(10) "Some error"
  ["file"]=>
  string(69) "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test.php"
  ["line"]=>
  int(7)
}
array(4) {
  ["type"]=>
  int(1024)
  ["message"]=>
  string(45) "count() expects at least 1 parameter, 0 given"
  ["file"]=>
  string(69) "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test.php"
  ["line"]=>
  int(7)
}

Calling @trigger_error()从你的错误处理程序中,并且不返回FALSE, 原因error_get_last()返回除NULL,但是因为错误被抑制了@,PHP 不输出任何内容。似乎为了避免无限递归,调用trigger_error()从注册的错误处理函数内部不会调用错误处理程序 - 这对我们有利。

显然,错误代码已被修改,但你可以将其转换为相关的E_USR_*如果需要,请编写代码 - 但我怀疑您真正想要的是字符串值,此方法将允许您获得该字符串值。不幸的是,您还丢失了行号和文件信息 - 尽管您可以通过在错误处理程序中执行涉及堆栈跟踪的操作来恢复这些信息,或者至少将其包含在传递的参数的字符串中。

这是一个可怕的、可怕的、可怕的黑客攻击——但由于没有官方批准的方法来做到这一点,所以黑客本质上就是你所要求的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

error_get_last() 和自定义错误处理程序 的相关文章

随机推荐

  • 我可以让 git 以合理的顺序打印 x.y.z 样式标签名称吗?

    考虑这个版本号列表 0 3 0 0 3 1 0 3 8 0 3 9 0 3 10 0 3 11 git tag将按以下顺序打印它们 0 3 0 0 3 1 0 3 10 0 3 11 0 3 2 我有什么办法可以使git tag按 数字 顺
  • 如何在 Python 中创建子进程?

    我想创建一个流程的子流程 展示如何实现这一目标的工作示例是什么 从子流程文档 如果你想得到输出 gt gt gt import subprocess gt gt gt output subprocess Popen uname a stdo
  • 如何在 ember.js 的组件中获取商店

    我究竟如何获得组件内部存储的句柄 我正在尝试创建一个从商店返回结果的自动完成组件 App AutoCompleteComponent Ember Component extend Ember Properites content Ember
  • 欧拉计划问题 14(Collat​​z 问题)

    为正整数集定义以下迭代序列 n gt n 2 n 为偶数 n gt 3n 1 n 为奇数 使用上面的规则并从 13 开始 我们生成以下序列 13 40 20 10 5 16 8 4 2 1 可以看出 这个序列 从 13 开始 到 1 结束
  • NSURLRequest:如何处理重定向的帖子?

    我对 NSURLRequest 和伴奏 实现进行了尝试和测试 它非常适合给定 URL 的 GET 和 POST 但是 我现在想要移动 URL 的目标而不更改应用程序使用的 URL 因此我打算通过 DNS 提供商使用 Webhop 重定向 这
  • Babel.js 如何将类声明编译成 ES2015?

    我当前的任务是将 JavaScript 组件 ES5 转换为 ES6 用 Babel js 编译 在使用类和 Babel js 之前 我们进行原型设计以从其他组件获取函数 com company js ComponentA prototyp
  • libpng 1.5.10 错误:取消引用指向不完整类型的指针

    png read info png ptr info ptr png byte color type info ptr gt color type png byte bit depth info ptr gt bit depth 对于最后两
  • 在 Javascript 中反序列化 PHP 数组

    我有一个表 其中包含一系列序列化数组的行 我计划请求并将其传递给JavaScript 问题是 是否有可能unserialize使用 JavaScript 而不是 PHP 否则 我将不得不加载所有行 循环它们并反序列化它们 并将它们分配给一个
  • kubernetes - 将入口流量路由到某些路径的特定 Pod

    我有多个 Pod 可以自动扩展和缩小 我使用入口作为入口点 我需要根据某些条件 比如说路径 将外部流量路由到特定的 Pod 在发出请求时 我确信特定的 Pod 已启动 例如 假设我有域 someTest com 通常将流量路由到 pod 1
  • 如果值是由触发器生成的,如何注释 Id 列?

    我设置了 Oracle XE 10g Hibernate 3 5 JPA 2 0 有一个带有主键的简单表 由数据库触发器在插入时生成 触发器从序列中获取值 触发器 序列构造是由Oracle XE 完成的 实际的问题是 在 EntityMan
  • devtools::check() 上的包导入错误

    我有一个包 其中在描述文件中包含以下包导入 Imports lubridate assertthat R6 stringr I don t使用以下命令将它们导入到我的包的命名空间中import pkgname or importFrom p
  • 如何在不创建数组的情况下使用 NgFor 来生成矩阵 UI 模式

    我想实现 UI 矩阵模式 它应该动态生成 通过接收输入参数 它应该决定 UI 矩阵图案的尺寸 例如 9X3 元素 图案 9x3 元素 我使用 Angular2 js typescript SCSS html 模板及其外观 import Co
  • 使用 sed 或 awk 修复日期格式

    我正在尝试使用以下方法将包含表格的 HTML 转换为 csv 文件bash script 到目前为止我已经完成了以下步骤 转换为 Unix 格式 使用dos2unix 删除所有空格和制表符 使用sed s t g 删除所有空行 用sed a
  • 如何从特定矩形区域内的 pdf 文档中提取文本? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我必须从特定矩形区域内的 pdf 文档中提取文本 工作流程如下 首先将pdf转换为jpg图像 然后用户在图片顶部绘制选择矩形 然后我需要以某种方式从
  • MVP 中的模型需要上下文

    在 android 中使用 MVP 时 我需要使用模型中的活动上下文来获取所有已安装应用程序的列表 访问上下文的正确方法是什么 或者在遵循 MVP 模式的同时实现相同目的的任何替代方法是什么 以下是课程 主要活动 java public c
  • Python 函数定义中 -> 是什么意思?

    我最近在看的时候发现了一些有趣的事情Python 3 3 语法规范 funcdef def NAME parameters gt test suite Python 2 中缺少可选的 箭头 块 我在 Python 3 中找不到有关其含义的任
  • onclick按钮时如何清除编辑文本

    如何清除单击按钮时动态提供给 EditText 的数据 我该如何编写代码 我使用什么功能或方法 Try public void clear View v edittext setText Where clear被注册为布局文件中按钮的 on
  • jquery:用跨度替换输入

    我试图用包含输入值的跨度替换输入 以便能够在单击按钮时将它们切换回来 我认为这最容易分两个阶段完成 添加 span input value span 在输入前面 然后隐藏输入 唯一的问题是我在第一部分遇到了麻烦 我正在尝试类似的事情 con
  • 从视图创建表 - Oracle SQL SQL 错误:ORA-01723:不允许使用零长度列

    我需要从视图创建一个表 语句如下 CREATE TABLE NEW TABLE AS SELECT from VIEW 它给出如下错误消息 无法从视图创建表 使用 Select 语句 Error report SQL Error ORA 0
  • error_get_last() 和自定义错误处理程序

    odbc errormsg不报告错误消息odbc execute就像它应该的那样 它只是发出警告 所以我被迫编写一个 hack 来解析错误消息error get last 我在用着set error handler and error ge