如何更改Exception对象的异常消息?

2024-04-21

所以我捕获了一个异常(Exception 类的实例),我想要做的是更改其异常消息。

我可以得到这样的异常消息:

$e->getMessage();

但如何设置异常消息呢?这是行不通的:

$e->setMessage('hello');

对于几乎所有的情况,您都应该抛出一个新的异常并附加旧的异常。没有必要让事情复杂化。

try {
    dodgyCode();
}
catch(\Exception $oldException) {
    throw new \Exception('My extra information', 0, $oldException);
}

不过,每隔一段时间,您实际上确实需要就地操作一个异常,因为抛出另一个异常实际上并不是您想要做的。

一个很好的例子是Behat https://github.com/Behat/Behat FeatureContext当您想在其中附加附加信息时@AfterStep方法。步骤失败后,您可能希望截取屏幕截图,然后在输出中添加一条消息,说明在哪里可以看到该屏幕截图。

因此,为了更改异常的消息,您可以替换它,并且不能抛出新的异常,您可以使用反射来暴力破解参数值:

$message = " - My appended message";

$reflectionObject = new \ReflectionObject($exception);
$reflectionObjectProp = $reflectionObject->getProperty('message');
$reflectionObjectProp->setAccessible(true);
$reflectionObjectProp->setValue($exception, $exception->getMessage() . $message);

这是上下文中的 Behat 示例:

    /**
     * Save screen shot on failure
     * @AfterStep
     * @param AfterStepScope $scope
     */
    public function saveScreenShot(AfterStepScope $scope) {
        if (!$scope->getTestResult()->isPassed()) {
            try {
                $screenshot = $this->getSession()->getScreenshot();
                if($screenshot) {
                    $filename = $this->makeFilenameSafe(
                        date('YmdHis')."_{$scope->getStep()->getText()}"
                    );
                    $filename = "{$filename}.png";
                    $this->saveReport(
                        $filename,
                        $screenshot
                    );
                    $result = $scope->getTestResult();
                    if($result instanceof ExceptionResult && $result->hasException()) {
                        $exception = $result->getException();

                        $message = "\nScreenshot saved to {$this->getReportLocation($filename)}";

                        $reflectionObject = new \ReflectionObject($exception);
                        $reflectionObjectProp = $reflectionObject->getProperty('message');
                        $reflectionObjectProp->setAccessible(true);
                        $reflectionObjectProp->setValue($exception, $exception->getMessage() . $message);
                    }
                }
            }
            catch(UnsupportedDriverActionException $e) {
                // Overly specific catch
                // Do nothing
            }
        }
    }

再次强调,如果可以避免的话,绝对不应该这样做。

Source: 我的老老板 http://blog.loftdigital.com/take-screenshot-with-behat-after-failed-step

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

如何更改Exception对象的异常消息? 的相关文章

  • Laravel 使用 Ajax 上传文件

    我正在使用 Laravel 框架 我有一种向数据库添加新项目的形式 在该形式中用户还可以拖放文件 然后 会显示一个进度条 直到完成为止 使用 Ajax 将文件上传到服务器 提交该表格后 我运行addItem在控制器中运行 我想要执行 检查
  • 将文件从 Dropbox 下载到服务器

    我想从 Dropbox 下载文件 并需要代表 Dropbox 用户将其保留在我的服务器中 我尝试使用curl 和file get contents 但未能成功 我需要使用 dropbox 的任何 api 方法吗 我可以从浏览器下载该文件 但
  • dayname(curdate()) 不适用于 codeigniter php

    此 sql 在 phpmyadmin 中有效 但在 codeigniter php 中无效 function getProgramsHomepage data array this gt db gt select p name p star
  • 从 CSV 到 MySQL 的换行问题

    我正在将 csv 文件导入 MySQL 除了文件中的换行符之外 一切正常 我的 csv 行之一如下所示 42 E A R Classic Earplugs ear images ear classic jpg 5 Proven size s
  • 在 PHP 中从 URL 斜杠后获取两个单词

    我需要从 URL 中获取两个单词 例如我有以下 URL http mydomain com alrajhi invoice 108678645541 http mydomain com alrajhi invoice 10867864554
  • 用教义 2 DBAL 连接子查询

    我正在重构 Zend 框架2应用程序使用学说 2 5 DBAL 而不是 Zend DB ZF1 我有以下 Zend Db 查询 subSelect db gt select gt from user survey status entrie
  • WSDL PHP 函数返回 null,而其他函数返回预期结果

    Summary 在这里 我将列出我解决此问题所采取的所有步骤 以供其他人参考 1 PHP 很愚蠢地 监听 函数的输入消息来定义它应该使用哪个函数 因此 为每个函数提供不同的输入消息 即使它使用相同的类型或元素 您可能认为这对您来说是一项艰巨
  • PHP_CodeSniffer规则文档[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以找到有关的文档PHP CodeSniffer http pear php net packa
  • 使用 MySQL 的 CURDATE() 或 PHP 的 date() 更快?

    使用mysql查询是不是更快 SELECT CURDATE as today 或 PHP 语句 curdate date Y m d 同样的答案是否适用于使用date VS MySQL 的NOW and CURTIME 如果您只是执行查询以
  • PHP 中 (int) $_GET['page'] 是什么意思?

    我试着抬头看 int 但只能找到该函数的文档int 在 PHP 手册中 有人可以向我解释一下上面的代码是做什么的 以及它到底是如何工作的吗 它将 至少尝试 将变量的值转换为整数 如果有字母等 前面会转成0
  • PHP diff() 给出不正确的值,其中 $date1 = '2016-03-01'

    我使用下面的代码来确定一年内的员工服务 datePay1 new DateTime date1 datePay2 new DateTime date2 interval datePay1 gt diff datePay2 vYears in
  • WooCommerce:返回特定类别中所有产品 ID 的函数

    我认为问题的标题是相当不言自明的 但要详细说明 我正在尝试在 Woocommerce 中制作自定义类别页面 我需要的是返回特定类别中的所有产品 ID 我见过这个帖子 https stackoverflow com questions 210
  • 如何获取laravel 5.4中的所有头信息

    当我打印时 echo pre print r getallheaders 它给出输出 Host gt abc com User Agent gt Mozilla 5 0 Macintosh Intel Mac OS X 10 12 rv 5
  • 使用 Symfony 3 / Doctrine 进行属性形式的一对多对一

    问题是这样的 我有一个包含 3 个类的模型 person 人员 工作 job 一个人可以有多个工作 任何工作与人的关系都可以有 date start 属性 date end 和 comment 因此 我使用持有这些属性的可连接 person
  • 在javascript中通过window.location传递数据

    我试图通过 window location 传递数据 数据在 del id img album 中可用 我想通过 window location 发送多个值 window location save php type deldownload
  • 用于验证网络路径的正则表达式 PHP、jQuery、JavaScript、Ruby

    尝试找出用于验证网络路径的正则表达式 即 comp xyz or comp or comp x y z storage或者所有部分都更长的东西 但希望能够传达其要点 我目前拥有的是一个简单的输入字段 用户可以通过它传递信息 事情是我不希望他
  • 展平数组:保持索引、值等于数组中的位置

    我在尝试以特定方式展平数组时遇到了一些麻烦 这里有一个print r我想要展平的数组的视图 Array 1 gt Array 8 gt 1 9 gt 2 10 gt Array 15 gt Array 22 gt 1
  • Mysql 将 --secure-file-priv 选项设置为 NULL

    我在 Ubuntu 中运行 MySQL 我在运行特定的查询集时收到此错误 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句 当我这样做的时候SELECT secure file priv 在我的 m
  • 在 PHP 数组定义中显示重复键警告

    下面的代码是否可以得到警告 error reporting E ALL s array a gt 1 a gt 1 var export s 你唯一的希望 除了count 你自己 是你的编辑足够聪明 可以突出显示拼写错误 此屏幕截图来自 P
  • 将 #RRGGBB 十六进制值转换为 #AARRGGBB

    414141 与 AARRGGBB 的值是什么 52b531 又如何 我如何使用 PHP 转换它 Regards 奔腾10 AA 是 Alpha 通道 直接转换是将 AA 设置为 FF 以使其完全不透明 414141 becomes FF4

随机推荐

  • rxjs:定期执行一些操作,中间有特定的延迟

    客户端应用程序向服务器发送请求 这可能需要很长时间才能完成 一旦请求完成或失败 客户端应该等待一段时间 即10秒 然后再次发送请求 目前的工作解决方案是这样的 appRequest new Subject ngOnInit void thi
  • 在状态更改时从 asp.net 的验证器获取事件到 jquery

    如果我的页面的验证器更改其状态 我希望在 jquery 中触发一个事件 这是我的用例 在地址表单中 验证器全部被隐藏 如果我提交表格 就会显示出来 现在我想触发一个 jQuery 函数 它用红色边框渲染所有行 不是输入字段 而是它们的父行
  • 使用 TypeScript、Jest 和 Enzyme 进行 React 单元测试:无法调用可能“未定义”的对象

    我正在使用 TypeScript 构建一个 React Native 应用程序 我正在使用 Jest 和 Enzyme 进行组件测试 我也在使用 React 导航 在我的最后一个问题中 https stackoverflow com que
  • 如何从 Chrome 扩展程序填写网页表单中的文本字段?

    到目前为止 我已经有了一个扩展程序 列出了用户所在的网页和一个按钮 单击该按钮后 应在文本字段中填写 testing123 在我正在测试的网页上 表单有一个 id 和名称 form 文本字段有一个 id 和名称 body 如果我能在填写此文
  • py.test 无法导入我的模块

    我正在努力正确导入 python 我想要实现的是拥有一个包含多个源文件的模块和一个包含单元测试的测试文件夹 无论我做什么 我都无法让 py test 3 执行我的测试 我的目录布局如下所示 module init py testclass
  • 上传成功后显示上传的图片

    我正在 Magnific Popup 灯箱 内使用 Carrierwave gem 我想做的是after上传图片 它将显示新上传的图片 目前 从灯箱上传图像后 它将继续显示您最初查看的图像 并显示 成功 消息 表明您的图像已成功上传 当前的
  • 托管多个 django 站点时出现问题(设置交叉)

    我最近设置了一个 Web 服务器 目前托管着几个静态页面网站和两个 django 项目 这两个 django 项目是 abc 和 xyz 分别位于主文件夹中的不同目录中 每个都有自己的 wsgi 脚本 该脚本指向各自的 settings p
  • 将 rbf 与 scipy 一起使用时出现内存错误

    I want to plot some points with the rbf function like here to get the density distribution of the points 如果我运行以下代码 它工作正常
  • “时钟”是否测量“睡眠”,即挂起的线程?

    我正在尝试理解clock t clock void 功能更好 有以下问题 我理解正确吗clock测量进程的滴答数 因为它是积极奔跑 and sleep挂起调用线程 在这种情况下只有一个线程 即主线程 因此挂起整个进程 意思就是clock不测
  • 使用 PHP 的 HTTP PUT、DELETE 和 I/O 流

    除了 HTTP PUT 方法之外 还有什么方法可以访问通过 HTTP PUT 方法发送的数据 putdata fopen php input r 我从未与PUT and DELETE方法和 putdata fopen php input r
  • 使用图形 api 在 sharepoint online 中创建多选字段的 POST 正文是什么?

    我正在尝试使用 Microsoft Graph 创建新的 SharePoint ListItem 要创建包含标题等简单字段的列表项 我的 POST 正文如下所示 fields Title Ehsan s REST 但是一旦我添加一个具有多选
  • 使用 Ionic core 4 时不会显示离子含量

    我正在开发一个使用 Vue js 和 Ionic 的应用程序 但我不明白为什么更新我的 Ionic 核心版本会破坏 ion content 标签 我尝试谷歌搜索该标签是否已停用 但似乎没有是这样的 为了说明这一点 我制作了一个使用 Ioni
  • 如何测试模块的运行块

    我希望我的 AngularJS 应用程序发出 http 请求以从服务器检索用户信息或重定向到登录屏幕 我在应用程序主模块的运行块中实现了这一点 但是如何在运行块中测试代码呢 或者我应该将此初始化代码移到控制器中以使其可测试 我正在使用 Ka
  • 从 Excel 到 SQL Server 的数据导入无法导入所有数据

    我在使用导入和导出数据工具将数据从 Excel 导入到 SQL Server 时发生了一件奇怪的事情 缺点是我可以在Excel中看到数据 但所有数据都没有导入 我有一本 Excel 工作簿 其中包含一个电子表格 我可以看到列中的数据 一切看
  • 如果没有收到请求的响应,会发生什么情况?我看到重试

    我认为我遇到的问题可能更多是与浏览器相关的问题 但它是一个非常基本的问题 当我冒险构建一个 Web 应用程序时 我也想找到答案 在我的客户端代码中我正在做一个 ajax称呼 这篇文章可能需要一段时间才能回复 我看到的是在一段时间后再次发送请
  • 在选定的数据范围内创建数据分区,将其输入到 caret::train 函数中以进行交叉验证

    我想为下面的数据框创建折刀数据分区 这些分区将用于caret train 像caret groupKFold 产生 然而 问题是我想将测试点限制为超过 16 天 同时使用这些数据的其余部分作为训练集 df lt data frame Eff
  • 如何用Python为ElasticSearch创建只读客户端?

    我想从 ES 读取数据 但不想意外向其中写入数据 无索引操作 这只是一种安全措施 以便以后修改查询函数的其他人不允许插入数据 当你说你想要只读客户端时 客户端强调您系统中的同一集群可能有其他客户端 然后阻止整个索引为只读将会阻止所有客户端的
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 如何在 Jupyter 中启用 R 语法突出显示?

    我希望为 Jupyter 编写的 R 代码添加语法突出显示 准确地说 语法高亮超出了数字 文本等已有的语法高亮 我的设置 Packges 康达R 3 2 4 康达版本 4 0 6 Jupyter版本4 1 0 在带有 Chrome 的 Wi
  • 如何更改Exception对象的异常消息?

    所以我捕获了一个异常 Exception 类的实例 我想要做的是更改其异常消息 我可以得到这样的异常消息 e gt getMessage 但如何设置异常消息呢 这是行不通的 e gt setMessage hello 对于几乎所有的情况 您