为什么要在 php 中使用异常处理?

2024-04-26

我已经编写 PHP 很长一段时间了,但对 PHP 5 的了解并不多……我了解 PHP 5 中的异常处理已经有一段时间了,但从未真正研究过它。经过快速谷歌后,使用异常处理似乎毫无意义 - 我看不出使用它比仅使用一些 if() {} 语句,也许还有我自己的错误处理类或其他东西有什么优势。

使用它必须有很多充分的理由(我猜?!),否则它就不会被放入该语言中(可能)。谁能告诉我它比仅使用一堆 if 语句或 switch 语句或其他语句有什么好处?


异常允许您区分不同类型的错误,并且对于路由也很有用。例如...

class Application
{
    public function run()
    {
        try {
            // Start her up!!
        } catch (Exception $e) {
            // If Ajax request, send back status and message
            if ($this->getRequest()->isAjax()) {
                return Application_Json::encode(array(
                    'status' => 'error',
                    'msg'    => $e->getMessage());
            }

            // ...otherwise, just throw error
            throw $e;
        }
    }
}

然后抛出的异常可以由自定义错误处理程序处理。

由于 PHP 是一种松散类型语言,因此您可能需要确保仅将字符串作为参数传递给类方法。例如...

class StringsOnly
{
    public function onlyPassStringToThisMethod($string)
    {
        if (!is_string($string)) {
            throw new InvalidArgumentException('$string is definitely not a string');
        }

        // Cool string manipulation...

        return $this;
    }
}

...或者如果您需要以不同的方式处理不同类型的异常。

class DifferentExceptionsForDifferentFolks
{
    public function catchMeIfYouCan()
    {
        try {
            $this->flyForFree();
        } catch (CantFlyForFreeException $e) {
            $this->alertAuthorities();
            return 'Sorry, you can\'t fly for free dude. It just don\'t work that way!';
        } catch (DbException $e) {
            // Get DB debug info
            $this->logDbDebugInfo();
            return 'Could not access database. What did you mess up this time?';
        } catch (Exception $e) {
            $this->logMiscException($e);
            return 'I catch all exceptions for which you did not account!';
        }
    }
}

如果在 Zend Framework 等中使用事务:

class CreditCardController extends Zend_Controller_Action
{
    public function buyforgirlfriendAction()
    {
        try {
            $this->getDb()->beginTransaction();

            $this->insertGift($giftName, $giftPrice, $giftWowFactor);

            $this->getDb()->commit();
        } catch (Exception $e) {
            // Error encountered, rollback changes
            $this->getDb()->rollBack();

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

为什么要在 php 中使用异常处理? 的相关文章

  • angularjs路由,如何检查模板文件是否存在

    我在我的应用程序中使用 angularjs 一切都运行良好 但在加载模板之前我只想检查它是否确实存在于给定的路径上 这是我的代码 when page angularAMD route templateUrl function rp retu
  • PHP文件上传错误tmp_name为空

    我的文件上传遇到这个问题 我尝试在检查验证时上传 PDF 文件TMP NAME是空的 当我检查时 FILES document attach error 该值为 1 意味着存在错误 但当我尝试上传其他 PDF 文件时 它已成功上传 为什么其
  • 如何使用类中的常量作为 php 函数中的参数定义?

    我有一堂课 class FetchMode const FetchAll 0 const FetchOne 1 const FetchRow 2 和一个函数 function getRecordSet FetchMode FetchMode
  • 捕获所有内部异常详细信息的最佳实践是什么? [复制]

    这个问题在这里已经有答案了 记录完整异常详细信息 包括所有可能的内部异常 的最佳实践是什么 目前 我使用以下代码 try some code that throws an exception catch Exception ex do Co
  • Yii:按条件进行多重排序

    我正在使用 CActiveDataprovider 显示来自不同表的数据 现在我遇到了一个问题 我有两个表 项目和类别 它们都有priority order 列 我需要使用这两个列的顺序来显示数据 例如 有两个类别和属于这些类别的六个项目
  • Composer 已安装,但获取 /usr/bin/env: php: No such file or directory

    在 CentOS 7 上 我安装了 PHP 7 1 然后我安装了作曲家 cd tmp curl sS https getcomposer org installer php71 gt used php71 instead of php ph
  • PHP邮件发送附件但附件为空

    基本上 我正在尝试通过 PHPMail 发送 PDF 电子邮件已发送 我在 Outlook 中完美收到 问题是附件已损坏并且无法打开 我什至尝试发送 HTML 但也是空的 我尝试在论坛中进行研究 尝试了几个 工作代码 其他人让它与此代码一起
  • 非法监控状态异常

    如何将轮询线程传递给另一个线程进行处理 程序执行在控制器类中 该类具有 main 方法和线程池 主类控制器 public static void main String args throws InterruptedException Ru
  • zend框架中的一个模块中的多个控制器

    你好 我是 zend Framework2 2 0 的新手 我想创建一个带有多个控制器的模块我已经从 github 下载了 Album 模块并且它工作正常 现在我想在其中添加更多控制器 下面我显示了模块中文件的文件夹结构 module Al
  • PHP:测试三个变量是否相等

    我以前从未遇到过这种情况 但是如何测试三个变量是否相同 以下内容显然不起作用 但我想不出一种优雅 且正确 的方式来编写以下内容 if select above average select average select below aver
  • Google 站点地图日期格式

    我需要 php 中站点地图的日期格式 我怎样才能做到这一点 这个输出对吗
  • 在 php 中进行 AES 加密,然后用 Javascript (cryptojs) 解密

    我正在寻找一种对简单文本 5 到 6 个数字和 或字符 进行双向加密的方法 问题是我想在 php 中进行加密 然后通过 Javascript 解密 对于 php 我已经使用 mcrypt encode 进行了测试并使其正常工作 因此当我尝试
  • PHP 中的 Javascript“unes​​cape”

    我的图像主机有一个 Google Chrome 扩展程序 它会向我的网站发送一个 URL 该网址得到encoded通过 JavaScript 的escape method 编码的 URLescape看起来像这样 http 253A 4 bp
  • waitUntilObjectExists() Amazon S3 PHP SDK 方法,它到底是如何工作的?

    该函数是否会暂停 php 脚本 直到在 s3 服务器上找到该对象 我将它放在 foreach 循环中 一张一张地上传图像 找到对象后 我调用一个方法在本地删除图像 然后删除本地文件夹 如果为空 这是正确的处理方式吗 谢谢 foreach f
  • 用于货币转换的php脚本

    我正在寻找一个可以进行货币转换的 php 脚本 在哪里可以找到与 codeigniter 配合使用的工具 取自http www ecb europa eu stats exchange eurofxref html index en htm
  • SO 日期计算和格式化

    SO 使用什么脚本来显示日期 因为它的格式和逻辑显示似乎相当不错 我不确定 StackOverflow 使用什么 但最常见的时间戳表示之一是 twitter 所做的 它将时间戳显示为a moment ago 30 seconds ago x
  • 循环遍历多维数组

    我有一个与此类似的 JSON 文件 Pages Name Home Page index php admin Name Admin Page admin index php Template admin MobileTemplate adm
  • 计算网站上多个文件的下载次数的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 问题是 计算网站上多个文件的下载次数的最佳方法 我正在尝试做的事情 跟踪并统计多个文件的下载数量 对于具有不同扩展名的文件 foo z
  • WP 用户注册 - 也可以立即选择他/她的密码

    这是一个非常简短的前端注册指南 但我在密码方面遇到了一个小问题 我禁用了用户注册时发送的带有密码生成的电子邮件 Don t Send Notification Email To Registered User if function exi
  • 限制 WooCommerce 上的域名注册

    如何限制用户电子邮件对 WooCommerce 注册中特定域的访问 我发现这段代码可以做到这一点 但由于某种原因它在 WooCommerce 注册表单上不起作用 如果我进入 WP 登录页面 它就会起作用 任何帮助表示赞赏 function

随机推荐

  • 如何显示信息窗口而不显示谷歌地图中标记的图标

    我可以只显示谷歌地图中的信息窗口吗 我正在使用 Google Map 的 V2 api 开发 Android 应用程序 我想在信息窗口中显示路线信息 但不想显示标记图标 那么信息窗口可以与标记分开吗 如果是这样 我怎样才能在隐藏标记的同时只
  • 在 $stateProvider.state 中分配多个控制器

    对于高级角度用户来说 这可能是一个简单的问题 但我没有在某个地方找到这个问题得到很好的解释 所以我正在重构我的代码 当我意识到一个视图中有两个控制器时 当控制器 ACtrl 由 stateProvider 绑定并且控制器 BCtrl 由 n
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 如何更改 React Material UI 上的 Stepper 颜色?

    在上面的屏幕截图中 我尝试将步骤颜色更改为 绿色表示正确 黄色表示正在进行 红色表示不正确 我怎么能这样做呢 如果有人仍在寻找这个问题 对于 MUI 5 可以通过SX属性 https mui com system the sx prop o
  • FlatList 内的 TextInput 在离屏时失去焦点

    当 TextInput 获得焦点并且用户滚动直到输入离开可见框架时 输入会变得模糊并且键盘消失 我该如何解决 我正在 Android 模拟器中运行代码 在 iOS 上不会出现此问题 如果您尝试点击 FlatList 底部的 TextInpu
  • 在 Woocommerce 中的账单详细信息之前添加新的自定义结帐字段?

    我可以将一组自定义字段添加到 WooCommerce 结账屏幕 但需要将其移至 账单详细信息 上方 那怎么办呢 根据这个 WooCommerce 官方文档 https docs woocommerce com document tutori
  • 无法使用 PDI 步骤连接到 HDFS

    我已经配置成功了Hadoop 2 4 in an Ubuntu 14 04 虚拟机 from a 视窗8系统 Hadoop 安装工作绝对正常 而且我还可以从 Windows 浏览器查看 Namenode 附图如下 所以 我的主机名是 ubu
  • 如何以编程方式获取设备的当前地理位置

    我需要获取设备当前的地理位置 场景 如果我在US my device location should be US 和我在的时候的情况一样UK my device location should be UK 我需要用于查找此地理位置的示例代码
  • 如何在 IndexedDB 中创建具有多个条件的查询

    我有一个商店有多个我想要查询的索引 为了举例 我们假设我有一个消息存储 其中包含 user id 索引和 create date 时间戳 并且假设我有索引 user id create date user id create date 我知
  • System.Net.WebException:服务器违反了协议

    我有以下代码来进行调用 然后返回 xml private string Send string url try HttpWebRequest request HttpWebRequest WebRequest Create url usin
  • 在watson会话中,如何从程序中的一个节点跳转到另一个节点?

    我面临一个问题 我已经在 Watson 对话工作区中创建了对话 并且我知道如何跳转到对话中的另一个节点 我的问题是如何跳转java程序 例如 我的对话中有5个节点 它们是顺序 node1 gt node2 gt node3 gt node4
  • 字符串文字:它们去了哪里?

    我对字符串文字的分配 存储位置感兴趣 我确实找到了一个有趣的答案here https stackoverflow com questions 51592 is there a need to destroy char string or c
  • Oracle 10g 内连接的 0RA-00952

    这有效 SELECT PRODUCT INFOS FIELD VALUE PRODUCT INFOS COIL ID SYSTEM PRODUCT INFOS TIME STAMP PRODUCT INFOS FIELD NAME FROM
  • 如何在 Symfony2 中动态添加验证器?

    I ve a password表单字段 not映射到User密码 与其他两个 映射 字段一起用于更改密码表单 first and last 我必须动态添加验证器 如果值密码为空则不进行验证应该发生 否则一个新的MinLength and M
  • 可以从 Angular ng-click 表达式调用“alert()”或“console.log()”吗?

    我试图测试我的ng click绑定正在工作 但我似乎遇到了一个更基本的问题 如何查看正在发生的事情 或没有发生 我常用的 粗暴 调试方法 alert and console log 似乎不可用 是否可以从 Angular 应用程序中访问这些
  • jQuery:处理 id 属性中的空格

    我有一个 id A B 的元素 下面的代码fails
  • Google App Maker 将记录保存到数据库每条记录需要 240 毫秒

    我们有一个使用 Google Cloud SQL 表的 Google App Maker 应用 我们的位置是中欧布拉格 保存一项记录至少需要令人难以置信的 240 毫秒 看起来 Google 应用制作工具在我的位置附近有一个代理 延迟约 2
  • 当您的 ant 构建过程在版本控制上崩溃时该怎么办

    所以我有一个很好的 Java 项目 使用 Ant 构建到 dist 文件夹 整个项目处于版本控制之下 因此我只需通过 dist 文件夹路径上的 svn导出 即可部署最新版本 但我的构建不断删除 dist 文件夹内的 svn 文件夹及其所有依
  • D3 数据对象内的循环数组

    data name c1 id 4690 day 1 3 start 8 00 end 10 00 name c3 id 5283 day 3 4 start 8 00 end 17 00 name c4 id 4862 day 4 sta
  • 为什么要在 php 中使用异常处理?

    我已经编写 PHP 很长一段时间了 但对 PHP 5 的了解并不多 我了解 PHP 5 中的异常处理已经有一段时间了 但从未真正研究过它 经过快速谷歌后 使用异常处理似乎毫无意义 我看不出使用它比仅使用一些 if 语句 也许还有我自己的错误