PHP 错误处理:die() 与trigger_error() 与 throw Exception

2024-02-02

关于 PHP 中的错误处理——据我所知有 3 种风格:

  1. die()or exit() style:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
    
  2. throw Exception style:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
    
  3. trigger_error() style:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }
    

现在,PHP 手册中使用了所有这三种方法。

  • 我想知道我应该喜欢哪种风格以及为什么?

  • 这 3 个滴可以互相替换吗?因此可以互换使用吗?

有点 OT:只是我还是每个人都认为 PHP 错误处理选项只是too many它在多大程度上让 php 开发人员感到困惑?


第一个永远不应该在生产代码中使用,因为它传输与最终用户无关的信息(用户无法对“无法连接到数据库”).

如果您知道在某个关键代码点,您的应用程序将抛出异​​常can fail并且您希望代码能够跨多个调用级别进行恢复。

trigger_error()允许您细粒度错误报告(通过使用不同级别的错误消息),并且您可以向最终用户隐藏这些错误(使用set_error_handler() http://php.net/manual/en/function.set-error-handler.php)但仍然在测试期间向您显示它们。

Also trigger_error()可以在开发过程中产生重要的非致命消息,可以使用自定义错误处理程序在生产代码中抑制这些消息。您也可能会产生致命错误(E_USER_ERROR)但这些是不可恢复的。如果触发其中之一,程序就会执行stops在那时候。这就是为什么对于致命错误,应该使用异常。这样,您将可以更好地控制程序的流程:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

在这里,如果gather_data()只是简单地嘎嘎叫(使用E_USER_ERROR or die())有机会,以前INSERT语句将进入您的数据库,即使不需要,并且您无法控制接下来会发生什么。

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

PHP 错误处理:die() 与trigger_error() 与 throw Exception 的相关文章

  • php 表单提交 - Q2

    我对这个虚拟问题感到抱歉 这是我的简单 PHP 表单 其中包含两个 SQL 表和 ADD 提交 按钮 我希望将人员从 Test1 转移到 Test2 很多事情都很好 只有提交按钮不起作用 因此 Test2 表没有反馈 Revised 现在提
  • PHP文件上传

    如果我想在文件名转到服务器的永久位置 而不是临时位置 之前更改文件名 我该如何执行此操作 代码如下
  • 如何使用 Google 帐户对我们网站中的用户进行身份验证

    如何在我们的网站中使用 Google 帐户对用户进行身份验证 我希望用户重定向到谷歌登录页面 然后将他重定向到我的网站 我想要这个 PHP 实现 你要OAuth http code google com apis accounts docs
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • PHP、jQuery 和 Ajax 调用乱序

    我正在使用 jQuery 进行 Ajax 调用 我有 x 数量的 Ajax 调用附加到 div 这些 Ajax 加载请求是由 PHP foreach 循环生成的 问题是它们渲染的顺序不正确 它们被设置在数组中
  • 在 Laravel 中动态设置数据库连接和语言

    我有 3 个域指向同一个Laravel应用 我想要的是每个人都连接到自己的数据库并根据 TLD 加载自己的语言文件 我可以在哪个文件中设置这些设置 我可以直接在配置文件中执行此操作 或者可以在加载配置之前执行某些事件 我拥有的是一个简短的函
  • 创建 Facebook 测试用户时访问令牌出现问题

    我正在尝试为我的 Facebook 应用程序创建测试用户 他们在 11 月份的博客文章 http developers facebook com blog post 429 中宣布了此功能 并在此处记录了该功能 http developer
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • 使用 NSError 检查错误的正确结构

    我正在编写各种例程 并尽力保持其整洁和重构 我正在创建的方法开始看起来与此代码类似 IBAction buttonPress id sender Create Document Shopping List with this documen
  • phpinfo 说 php.ini 路径是 C:\Windows 但那里没有 php.ini

    我们正在尝试从 PHP5 切换到 PHP7 现在我们已经安装了 Apache 并且 PHP 可以运行了 然而 我们在php ini文件没有任何作用 Via phpinfo 我们意识到原因是Configuration File php ini
  • PHP:在脚本完成之前获取输出

    我有一个名为 data php 的脚本 如下所示 do some stuff echo result do some other stuff eg database operations 我需要在另一个脚本中使用 data php 的输出
  • PHP 错误:“无法通过引用传递参数 2”

    我只是需要有关这个 PHP 错误的帮助 我不太明白 致命错误 无法在第 13 行 web stud openup inactivatesession php 中通过引用传递参数 2
  • magento成功页面变量

    我正在尝试捕获一些 magento 成功页面变量以传递给我们的广告公司 到目前为止 我已经得到了这个 但变量没有输出任何内容 数据需要采用以下格式 price1 price2 price3 qty1 qty2 qty3 sku1 sku2
  • wordpress - 像 stackoverflow 中那样内嵌 ajax 注释

    我有一个 WordPress 博客 希望为人们提供与 stackoverflow 中添加评论相同的用户体验 有很多评论 ajax 插件 但我找不到一个可以使用的插件 它允许您在主页上内联 进入并添加评论 而无需先深入到单独的单个帖子页面 任
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • 使用 fopen() 包装器创建 ZIP 文件

    如何使用以下命令创建 ZIP 文件fopen 包装器 http es php net manual en wrappers compression php 这显然是not道路
  • 使用 PHP 和 OAuth 访问 SkyDrive

    我想使用 PHP 访问 skyDrive 我想检索文件和文件夹列表 下载 上传和删除文件 我有一个 microsoft dev clientID 和 clientSecret 有人可以帮助我开始使用 OAuth 连接到 skyDrive 并
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码

随机推荐

  • 使用 JS 强制页面缩放至 100%

    我在 Canvas 中创建了一个小游戏 但遇到了问题 某些将默认缩放设置为 100 以外的用户无法看到整个游戏页面 我尝试过使用这个CSS zoom 100 这个 HTML 还有这个JS style zoom 75 有什么想法如何以编程方式
  • React Redux:获取 Props 并更新状态

    我是第一次尝试 React Redux JS 我对在组件中设置状态与让 redux 更新它有点困惑 我想单击一个按钮将 lightOn 设置为 true 并显示更新的 this props lightOn 值 我错过了一些基本的东西 但不确
  • JsonConverter如何反序列化为通用对象

    我通过 webapi 发送这个结构 DataContract public class PacketData public enum Opcodes Hello 0x00 Close 0x01 Serial 0x02 GPIO 0x04 D
  • 模型类未声明显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中

    我正在使用 sphinx 并尝试为我的 Django 项目生成文档 我决定首先尝试记录模型 因此在我的 rst 文件中我这样做了 wdland models automodule wdland models members undoc me
  • 如何检测innerHTML何时完成

    我已经做了很多寻找这个问题的解决方案 但到目前为止还没有找到一个可以跨浏览器工作的解决方案 我需要的是一个原始的javascript函数 一旦innerHTML成功插入到dom中 它将接受一个元素并运行回调 e g var element
  • 对 CUBEVALUE 中的多个度量求和

    我尝试了多个不同的函数 CUBESET CUBEVALUE 等 但我似乎无法找到一种方法来在同一公式中对多个度量求和 关于如何完成这项工作有什么建议吗 我进行了大量搜索但找不到方法 想法如下 但这不起作用 CUBEVALUE Connect
  • org.webrtc.RTCPeerConnection 无法将视频发布到服务器

    我使用 webrtc 在会议中发送和获取视频 子主视频正常显示 但问题是视频没有发布到服务器 我检查方法 setlocalDescription 没有返回错误 这是我的sdp 有人可以帮忙吗 我搜索了很多解决方案 但我仍然不知道我的问题 我
  • Oracle PLSQL IN() 子句中的数组

    我将字符串数组 plcListchar 传递给存储过程 我想在 IN 子句中使用这个字符串数组 我不能在 IN 子句中直接使用 plcListchar 让我展示一下如何在 JAVA 中创建 plcListchar 字符串数组 String
  • github 操作workflow_run.conclusion 随机失败的任何解决方法吗?

    我在用着workflow run conclusion按照以下方式发送工作流程通知github 文档 https docs github com en actions using workflows events that trigger
  • Python 与电报机器人中的关键字“from”冲突

    我想使用 python telegram bot 在 Python 脚本中打印用户信息 参考this https core telegram org bots api user page 但是当我打字时 print update messa
  • 如何在 Azure 表存储中存储任意键值对?

    背景 我从客户端收到 CSV 数据文件 其中包含大量我不需要的数据和少量我需要的数据 将来我可能需要访问这些数据 虽然我正在存档原始数据文件 但我希望有一些更容易查询的东西 我希望找到一个并不意味着数据文件保持相同格式的解决方案 即客户端可
  • 在 XNA 4.0 中绘制具有多个侧面的纹理立方体

    几个小时以来我一直在努力解决这个问题 我想做的是画一个立方体 每一面都有不同的纹理 或者更具体地说 我希望能够指定每面我想要的任何纹理 我用了这个例子here http www switchonthecode com tutorials c
  • GWT:如何更改 GWT Celltable 中的行颜色

    我在 GWT 中有一个单元格表 我可以通过此更改特定列的颜色 celltable addColumnStyleName 4 bluetext 但我怎样才能改变例如第3行的颜色 Thanks 您必须提供一个RowStyles返回每行的 css
  • 什么是异步图片下载以及如何下载过多图片?

    我有太多图像无法从网络下载到 iPhone 中 如何使用异步图像下载构建应用程序 最常见和最简单的方法是使用 NSURLConnection 进行异步请求 与请求集委托创建连接 当收到下一个数据块 完成加载或失败时 它开始在后台调用委托方法
  • Netbeans 可能存在错误,它正在执行我更改的旧代码

    我一直在一个包含 500 多个类的项目中进行编码 其中一个类负责从磁盘检索数据 由于某些原因 我更改了代码 但是当我运行代码时 它仍然执行类的旧代码 当我调试时 调试器会移过空行 这意味着它仍然运行我更改的旧代码 我多次清理和构建了该项目
  • 片段 YouTubePlayerSupportFragment 中存在重复的 ID

    我正在尝试使用 API Youtube 执行播放视频 但在 XML 重复 ID 0x7f080039 中收到错误 知道如何解决这个问题吗 我的片段扩展了 YouTubePlayerSupportFragment Override publi
  • 为什么`false && true || true` 评估为 true?

    根据MDN 逻辑运算符 https developer mozilla org en US docs Web JavaScript Reference Operators Logical Operators page false 任何短路评
  • 在Django项目中,如何通过迁移文件重建模型类?

    在Django项目中 如果模型文件夹文件被删除 是否可以使用migrations文件夹文件来重建模型类 mohammadKazemSamiel 我用我的 Postgres 数据库尝试了以下操作 python manage py inspec
  • 我可以使用 Gmail API 获取 Gmail 草稿的 URL 链接吗?

    新的 Gmail API 允许我们创建和查看草稿 但是有没有办法获得 URL 链接来查看草稿呢 我可以使用草稿的 ThreadId 手动创建链接 如下所示 https mail google com mail u 0 drafts comp
  • PHP 错误处理:die() 与trigger_error() 与 throw Exception

    关于 PHP 中的错误处理 据我所知有 3 种风格 die or exit style con mysql connect localhost root password if con die Could not connect mysql