Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
在PHP中优雅地使用字符串标识自定义异常_创想鸟

在PHP中优雅地使用字符串标识自定义异常

在php中优雅地使用字符串标识自定义异常

PHP标准异常类要求异常码为整数,这使得直接使用字符串作为异常标识符变得复杂。本教程将介绍如何通过定义特定的异常类来克服这一限制,实现类型化的异常处理和测试。这种方法不仅提供了清晰的字符串标识,还增强了代码的可读性、可维护性,并充分利用了PHP的类型系统进行精确的异常捕获和测试。

在PHP开发中,我们经常需要抛出自定义异常来处理业务逻辑中的错误情况。虽然PHP的Exception基类允许我们定义一个整数类型的错误码(code),但很多开发者更倾向于使用具有语义的字符串作为异常标识符,例如”user_not_found”或”invalid_input”。这不仅提高了代码的可读性,也使得在测试时能够更直观地判断异常类型。

然而,直接将字符串作为Exception构造函数中的$code参数是不允许的,因为该参数要求是整数类型。常见的变通方法是传递一个整数码,然后将字符串标识符放入异常的上下文数组或消息中。虽然这种方法可行,但在测试时需要额外的逻辑来解析上下文,不如直接基于类型进行判断来得优雅。

本教程将介绍一种更符合PHP面向对象范式的解决方案:通过定义具体的异常类来作为其自身的字符串标识符,并结合PHPUnit的类型化异常测试功能,实现清晰、可维护的异常处理。

立即学习“PHP免费学习笔记(深入)”;

核心思想:利用异常类名作为标识符

最直接且符合PHP面向对象原则的方法是,让每一个需要独立识别的异常情况都对应一个独立的异常类。这样,异常的“字符串标识符”就自然地成为了该异常的完整类名(例如AppExceptionsUserNotFoundException)。

1. 定义一个基础自定义异常类

首先,我们可以定义一个基础的自定义异常类,它继承自PHP的Exception。这个基础类可以用于封装一些通用的逻辑,例如统一的日志记录或额外的上下文信息存储。

internalIdentifier = $internalIdentifier;    }    /**     * 获取内部字符串标识符     *     * @return string     */    public function getInternalIdentifier(): string    {        return $this->internalIdentifier;    }}

在这个BaseCustomException中,我们引入了一个$internalIdentifier属性来存储我们期望的字符串标识符。虽然我们仍然需要将$message和$code传递给父类的构造函数,但现在我们有了一个明确的地方来存储和获取我们的字符串标识。

2. 实现具体的业务异常类

接下来,为每种特定的业务错误定义一个继承自BaseCustomException的子类。这些子类将作为我们主要的“字符串标识符”。

<?phpnamespace AppExceptions;use Throwable;class UserNotFoundException extends BaseCustomException{    /**     * @param string $message 异常消息     * @param int $code 异常的整数代码     * @param Throwable|null $previous 链式异常的前一个异常     */    public function __construct(string $message = "User not found", int $code = 404, ?Throwable $previous = null)    {        // 调用父类构造函数,传入我们期望的字符串标识符 "user_not_found"        parent::__construct('user_not_found', $message, $code, $previous);    }}class InvalidInputException extends BaseCustomException{    public function __construct(string $message = "Invalid input provided", int $code = 400, ?Throwable $previous = null)    {        parent::__construct('invalid_input', $message, $code, $previous);    }}

现在,UserNotFoundException::class(其值为”AppExceptionsUserNotFoundException”)本身就成为了一个独特的字符串标识符。同时,通过getInternalIdentifier()方法,我们仍然可以获取到更简洁的”user_not_found”字符串。

3. 抛出自定义异常

在业务逻辑中,您可以像抛出任何其他异常一样抛出这些自定义异常:

delete();    }}

4. 在PHPUnit中进行测试

这种方法最显著的优势体现在单元测试中。PHPUnit提供了expectException()方法,可以直接断言抛出的异常类型,这比检查整数代码或解析上下文数组要简洁和健壮得多。

expectException(UserNotFoundException::class);        // 调用会抛出异常的代码        $userService->deleteUser(999); // 假设ID 999 的用户不存在    }    public function testDeleteExistingUserSuccessfully(): void    {        // ... 设置一个存在的用户        // $this->assertTrue($userService->deleteUser(1));    }}

通过$this->expectException(UserNotFoundException::class);,我们清晰地表达了测试意图:期望在执行特定操作时,系统会因为用户未找到而抛出UserNotFoundException。

注意事项与总结

类型安全与可读性: 这种基于类名的异常处理方法提供了卓越的类型安全。在catch块中,您可以直接捕获特定的异常类型,而无需进行字符串或整数的比较:

try {    $userService->deleteUser(100);} catch (UserNotFoundException $e) {    // 处理用户未找到的特定逻辑    error_log("User not found: " . $e->getInternalIdentifier() . " - " . $e->getMessage());    // ...} catch (BaseCustomException $e) {    // 处理所有其他自定义异常    error_log("Custom error: " . $e->getInternalIdentifier() . " - " . $e->getMessage());} catch (Exception $e) {    // 处理所有其他通用异常    error_log("General error: " . $e->getMessage());}

IDE支持: 现代IDE对类型提示有很好的支持,这使得在编写catch块时能够获得更好的自动补全和代码导航体验。可维护性: 当您需要修改某个异常的“标识符”时,只需重命名其类即可,IDE通常能帮助您自动重构所有引用。相比之下,修改字符串常量或整数码可能需要更仔细的全局搜索和替换。整数代码的用途: 尽管我们主要使用类名作为标识,但Exception的整数code参数仍然有用。例如,您可以将其用于HTTP状态码(如400, 404, 500),或与外部系统(如API错误码)进行集成。在我们的BaseCustomException中,$code参数被保留并传递给父类,这意味着您仍然可以根据需要设置它。内部标识符的用途: getInternalIdentifier()方法返回的字符串标识符,可以在日志记录、API响应中作为机器可读的错误码,或在某些特定场景下需要一个简洁字符串标识时使用。它作为对异常类名的补充,提供了更灵活的标识方式。

通过采用这种基于类型化的自定义异常处理方案,您可以在PHP项目中实现更清晰、更健壮、更易于测试的错误处理机制,同时优雅地解决了使用字符串作为异常标识符的需求。

以上就是在PHP中优雅地使用字符串标识自定义异常的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1333409.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Laravel中高效合并PDF文件:基于libmergepdf的专业指南
上一篇 2025年12月12日 19:24:35
PHP中精确控制字符串数字小数点插入位置的教程
下一篇 2025年12月12日 19:24:56

相关推荐

  • 快手视频如何增加点赞_快手视频增加点赞的实用方法

    快手视频如何增加点赞_快手视频增加点赞的实用方法快手视频如何增加点赞_快手视频增加点赞的实用方法快手视频如何增加点赞_快手视频增加点赞的实用方法快手视频如何增加点赞_快手视频增加点赞的实用方法

    提升快手视频点赞量需优化封面标题、参与热门话题、使用粉条推广、加强观众互动、注重内容质量。1. 选用精彩画面作封面,标题用疑问句或数字吸引点击;2. 参与“挑战榜”等热门活动并添加话题标签;3. 通过快手粉条设置推广目标为点赞评论,提升曝光;4. 视频结尾提问并及时回复评论,增强粉丝粘性;5. 保证…

    2026年9月24日 • 用户投稿
    000
  • sublime怎么配置React开发环境_sublime搭建React开发环境步骤

    sublime怎么配置React开发环境_sublime搭建React开发环境步骤sublime怎么配置React开发环境_sublime搭建React开发环境步骤sublime怎么配置React开发环境_sublime搭建React开发环境步骤sublime怎么配置React开发环境_sublime搭建React开发环境步骤

    首先安装Package Control,再通过它安装Babel、Emmet、SublimeLinter等插件;接着将.js/.jsx文件语法设为JavaScript (Babel)以支持JSX高亮;然后配置ESLint实现代码检查;最后可选配置构建系统运行npm start命令。 要在 Sublim…

    2026年9月24日 • 用户投稿
    000
  • 神马搜索App夜间模式使用详解_神马搜索App护眼设置优化

    神马搜索App夜间模式使用详解_神马搜索App护眼设置优化神马搜索App夜间模式使用详解_神马搜索App护眼设置优化神马搜索App夜间模式使用详解_神马搜索App护眼设置优化神马搜索App夜间模式使用详解_神马搜索App护眼设置优化

    开启夜间模式可降低神马搜索App的屏幕亮度与蓝光,缓解暗光环境下的视觉疲劳。首先进入“我的”-“设置”-“显示与字体”,开启夜间模式;随后可设置定时切换,如晚9点至早7点自动启用;接着调节夜间亮度与对比度,匹配环境光线;最后根据偏好自定义夜间主题颜色,如深蓝或墨绿,提升观感舒适度。 如果您在夜间或光…

    2026年9月24日 • 用户投稿
    100
  • php-gd怎么销毁图像资源_php-gd释放内存中的图像

    使用imagedestroy()函数销毁PHP-GD图像资源以避免内存泄漏。创建的资源如$image需在处理后调用imagedestroy($image)释放,尤其在循环中应每轮结束前销毁资源,推荐结合is_resource()判断有效性,遵循“谁创建,谁销毁”原则,确保内存高效管理。 在使用 PH…

    2026年9月24日
    000
  • 夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置

    夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置

    夸克浏览器下载的电子书通常存于设备Download文件夹中,可经文件管理进入内部存储查找“Quark”子目录;在线阅读缓存则位于/Android/data/com.quark.browser/files下的Cache或Book目录,多为加密.dat文件;导出已下载电子书需通过App内书架的导出或分享…

    2026年9月24日 • 用户投稿
    500
  • MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复

    MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复

    首先检查网络连接是否稳定,确认Siri服务状态正常,接着在系统设置中启用Siri并授予麦克风权限,通过终端重启Siri进程,必要时重置NVRAM/PRAM,最后创建新用户账户排除配置损坏问题。 如果您在使用Mac时发现Siri无法响应或功能异常,可能是由于网络连接、系统设置或权限问题导致。以下是排查…

    2026年9月24日 • 用户投稿
    000
  • 京东plus月卡能领双11券吗?京东plus有月卡吗

    京东plus月卡能领双11券吗?京东plus有月卡吗京东plus月卡能领双11券吗?京东plus有月卡吗京东plus月卡能领双11券吗?京东plus有月卡吗京东plus月卡能领双11券吗?京东plus有月卡吗

    京东PLUS月卡用户可领双11大额券,需在优惠期内保持会员有效,通过“我的-PLUS会员”进入领券中心,按时领取满减券并结合红包口令提升优惠。 如果您想在短时间内享受京东PLUS会员的专属优惠,但又不想长期付费,可能会考虑月卡服务。关于京东PLUS月卡是否能领取双11大额优惠券的问题,以下是相关信息…

    2026年9月24日 • 用户投稿
    000
  • sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法

    sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法

    答案:可通过修改hosts文件、清理授权信息或降级版本缓解Sublime Text启动弹窗。具体操作包括屏蔽验证域名license.sublimehq.com、重命名Local目录下的Registry.dat文件,或安装旧版本并关闭更新提示,但建议支持正版以获得更好体验。 Sublime Text …

    2026年9月24日 • 用户投稿
    000
  • 铁路12306电子发票下载失败怎么解决_铁路12306电子发票下载问题解决方案

    铁路12306电子发票下载失败怎么解决_铁路12306电子发票下载问题解决方案铁路12306电子发票下载失败怎么解决_铁路12306电子发票下载问题解决方案铁路12306电子发票下载失败怎么解决_铁路12306电子发票下载问题解决方案铁路12306电子发票下载失败怎么解决_铁路12306电子发票下载问题解决方案

    首先检查网络连接并重新尝试下载电子发票,若失败可联系12306客服重发,同时查看邮箱垃圾文件夹,最后可通过个人所得税App等工具同步管理发票。 如果您在尝试下载铁路12306电子发票时遇到失败情况,可能是由于网络连接、系统状态或权限设置等问题导致。以下是针对该问题的多种解决方案。 本文运行环境:iP…

    2026年9月24日 • 用户投稿
    100
  • 比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址

    比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址

    比漫熊漫画官网入口为https://www.bimanxiong.com,平台涵盖恋爱、悬疑等多种题材,每日更新连载,提供高清画质与简洁界面,支持分类筛选、夜间模式及书架收藏,优化阅读体验。 比漫熊漫画官网入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来比漫熊漫画官网在线阅读入口地…

    2026年9月24日 • 用户投稿
    700
  • sublime怎么完全重置到初始状态_sublime恢复默认配置的步骤

    sublime怎么完全重置到初始状态_sublime恢复默认配置的步骤sublime怎么完全重置到初始状态_sublime恢复默认配置的步骤sublime怎么完全重置到初始状态_sublime恢复默认配置的步骤sublime怎么完全重置到初始状态_sublime恢复默认配置的步骤

    完全重置Sublime Text需先关闭程序,再删除系统中的Data目录:Windows路径为C:Users用户名AppDataRoamingSublime TextData,macOS为~/Library/Application Support/Sublime Text/Data,Linux为~/…

    2026年9月24日 • 用户投稿
    300
  • JFugue中和弦解析的深度解析与实践

    JFugue中和弦解析的深度解析与实践JFugue中和弦解析的深度解析与实践JFugue中和弦解析的深度解析与实践JFugue中和弦解析的深度解析与实践

    JFugue库的onChordParsed方法不会被调用,因为JFugue将和弦分解为独立的音符进行处理。本文详细阐述了如何通过onNoteParsed方法结合音符的isFirstNote(), isHarmonicNote(), isMelodicNote()属性来识别Staccato字符串中的和…

    2026年9月24日 • 用户投稿
    100
  • 公众号文章如何插入小程序_在文章中插入小程序的正确操作方法

    公众号文章如何插入小程序_在文章中插入小程序的正确操作方法公众号文章如何插入小程序_在文章中插入小程序的正确操作方法公众号文章如何插入小程序_在文章中插入小程序的正确操作方法公众号文章如何插入小程序_在文章中插入小程序的正确操作方法

    可通过图文编辑器插入小程序卡片,设置封面标题及路径;或将小程序链接设为“阅读原文”跳转目标;也可通过自定义菜单关联小程序并引导用户点击;对于无法使用插件的情况,可生成小程序码图片嵌入文章,配以“长按识别”提示语。 如果您希望在公众号文章中增加互动性或引导用户使用特定功能,可以通过插入小程序来实现。小…

    2026年9月24日 • 用户投稿
    100
  • 怎么在mysql中创建一个表 mysql新建数据表步骤教程

    在 mysql 中创建表的步骤和建议包括:1. 明确业务需求,设计表结构;2. 使用 create table 语句创建表,选择合适的数据类型和设置主键、索引;3. 考虑大数据量时使用分区;4. 设置正确的字符集和排序规则;5. 谨慎使用索引;6. 使用 if not exists 避免重复创建表。…

    2026年9月24日
    100
  • 百度搜索app如何设置默认搜索引擎_百度搜索app搜索引擎切换的详细步骤

    百度搜索app如何设置默认搜索引擎_百度搜索app搜索引擎切换的详细步骤百度搜索app如何设置默认搜索引擎_百度搜索app搜索引擎切换的详细步骤百度搜索app如何设置默认搜索引擎_百度搜索app搜索引擎切换的详细步骤百度搜索app如何设置默认搜索引擎_百度搜索app搜索引擎切换的详细步骤

    百度App不支持更换默认搜索引擎,用户需通过系统浏览器或第三方浏览器设置。首先检查百度App内“我的-设置”是否有搜索引擎选项;若无,可进入手机系统设置中修改默认浏览器的搜索引擎;或下载如Kiwi Browser、Firefox等支持自定义搜索引擎的浏览器,将其默认搜索设为百度,实现灵活搜索体验。 …

    2026年9月24日 • 用户投稿
    000
  • Spring Boot @Nested 测试中属性覆盖与隔离策略

    Spring Boot @Nested 测试中属性覆盖与隔离策略Spring Boot @Nested 测试中属性覆盖与隔离策略Spring Boot @Nested 测试中属性覆盖与隔离策略Spring Boot @Nested 测试中属性覆盖与隔离策略

    本文深入探讨了在Spring Boot集成测试中,如何利用@Nested注解结合@TestPropertySource实现细粒度的属性配置和隔离。通过详细的示例代码,展示了外部测试类和嵌套测试类如何定义各自的属性集,以及这些属性在不同测试上下文中的继承与覆盖机制,从而确保测试环境的精确控制和独立性。…

    2026年9月24日 • 用户投稿
    100
  • 2025拼多多双11力度大吗?2025拼多多新版本

    2025拼多多双11力度大吗?2025拼多多新版本2025拼多多双11力度大吗?2025拼多多新版本2025拼多多双11力度大吗?2025拼多多新版本2025拼多多双11力度大吗?2025拼多多新版本

    拼多多2025年双11延续低价策略,升级百亿补贴、推出超级拼团2.0、发放直播神券、启用AR购物空间并扩容会员特权,覆盖iPhone、家电、美妆等品类,叠加多重优惠与互动玩法提升用户体验。 如果您计划在2025年双11期间购物,可能会关注拼多多此次大促的优惠幅度是否足够吸引人。今年拼多多延续了其“低…

    2026年9月24日 • 用户投稿
    000
  • 漫客栈免费登录网页_漫客栈官方网站漫画入口

    漫客栈免费登录网页_漫客栈官方网站漫画入口漫客栈免费登录网页_漫客栈官方网站漫画入口漫客栈免费登录网页_漫客栈官方网站漫画入口漫客栈免费登录网页_漫客栈官方网站漫画入口

    漫客栈免费登录网页入口是https://www.mankezhan.com/,该平台提供海量原创漫画资源,涵盖多种题材,支持多端阅读、离线下载与互动评论,阅读体验良好。 漫客栈免费登录网页入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来漫客栈官方网站漫画入口,感兴趣的网友一起随小编…

    2026年9月24日 • 用户投稿
    200
  • 快手账号如何实名认证_快手账号实名认证的步骤与要求

    快手账号如何实名认证_快手账号实名认证的步骤与要求快手账号如何实名认证_快手账号实名认证的步骤与要求快手账号如何实名认证_快手账号实名认证的步骤与要求快手账号如何实名认证_快手账号实名认证的步骤与要求

    未完成实名认证将限制快手直播和视频发布功能。个人用户需通过身份证认证并可能配合人脸识别,企业用户则需提交营业执照及完成对公打款验证,审核通过后方可开通权限。 如果您已经注册了快手账号,但发现无法开通直播或发布某些视频,很可能是因为尚未完成实名认证。实名认证是使用快手核心功能的前提,未认证账号将受到多…

    2026年9月24日 • 用户投稿
    200
  • Android应用中通过下载链接从Firebase Storage下载文件教程

    Android应用中通过下载链接从Firebase Storage下载文件教程Android应用中通过下载链接从Firebase Storage下载文件教程Android应用中通过下载链接从Firebase Storage下载文件教程Android应用中通过下载链接从Firebase Storage下载文件教程

    本教程详细介绍了在Android应用中如何利用文件的下载URL,结合Android DownloadManager将Firebase Storage中的文件下载到用户设备指定目录。内容涵盖必要的运行时权限处理、清单文件配置以及DownloadManager的具体使用方法,旨在帮助开发者实现本地文件存…

    2026年9月24日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信