PHP(或其他):处理“不可能发生”的异常的策略

2024-03-11

考虑以下代码。

class C {}

/**
 * @throws \InvalidArgumentException
 */
function classCreateInstance($class) {
  if (!is_string($class)) {
    throw new \InvalidArgumentException("Class name must be a string.");
  }
  if (!class_exists($class)) {
    throw new \InvalidArgumentException("Class '$class' does not exist.");
  }
  return new $class();
}

/**
 * @return C
 */
function foo() {
  return classCreateInstance(C::class);
}

有一个函数可能会抛出异常,因为它不知道有关$class争论。

另一方面,调用代码知道“C”是有效的类名,因此它会假设“InvalidArgumentException”永远不会发生。它希望避免冗长的 try/catch,并且希望避免拥有自己的@throws标签。特别是如果它不“允许”有一个,因为它正在实现一个不注释异常的接口。

但是,从 IDE/自动代码验证的角度来看,忽略此异常并不安全。

那么......从调用代码的角度来看,处理“几乎不可能”的异常的正确方法是什么?


在爪哇。 “已检查”异常类和“未检查”异常类之间存在区别。只有受检查的异常才是接口契约的一部分,而即使接口没有声明它,也允许抛出“未经检查的”异常。

在 Java 中,在“不应该发生”的情况下,人们会抛出未经检查的异常 - 例如“运行时异常”。

在 PHP 中,这都是基于约定的。方法可以抛出任何他们想要的异常。添加一个@throws文档注释中的标签很好,但它不是由语言强制执行的。

但是,可以将 IDE 或可能的其他代码审查工具配置为基于检查异常与非检查异常的 Java 模型来分析代码。

例如。 PhpStorm 可以选择不需要@throwsRuntimeException 和 LogicException 的 doc 标记。因此,这将允许将这些视为“未检查”异常,但随后编写自定义异常类并将它们视为 Java 中的“已检查”异常。

PHP 中的原生异常类:http://php.net/manual/en/spl.exceptions.php#spl.exceptions.tree http://php.net/manual/en/spl.exceptions.php#spl.exceptions.tree并不是说这些都继承自 LogicException 或 RuntimeException,因此它们都将被视为“未检查”。只有根类,Exception(和自定义子类)将被视为“已检查”。

这种区别还意味着,如果您调用没有声明/注释的异常的方法/函数,您仍然需要考虑可能会引发异常。这可以被涵盖,例如通过应用程序顶层的 try/catch 。 (例如index.php)

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

PHP(或其他):处理“不可能发生”的异常的策略 的相关文章

  • PHP7.1上读取会话数据失败

    分享一个我遇到的问题 现已解决 在我的开发机器上 我使用 PHP 运行 IIS 我升级到 PHP7 突然我的代码不再工作 返回此错误 session start 读取会话数据失败 用户 路径 C WINDOWS temp 看起来像是权限问题
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • CodeIgniter加入选择为

    我的数据库中有 2 个表需要加入 一张表是 artikelen 表 另一张表是 Collections 表 我目前有 this gt db gt select this gt db gt from collecties this gt db
  • 获取谷歌测试异常抛出消息[重复]

    这个问题在这里已经有答案了 我正在为我的项目使用谷歌测试框架 我从代码中抛出异常 throw DerivedClassException message 并在测试框架中使用 ASSERT THROW commond DerivedClass
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • Swift try inside Objective-C 块

    我需要创建一个函数foo它接受一个抛出闭包作为参数 我可以使用 Swift 或 ObjC 来实现它 但我需要能够从两者中调用它 像这样 Swift func bar throws func foo block throws gt void
  • 确定 PHP 到目前为止执行了多长时间

    我需要确定 PHP 函数到目前为止已经运行了多长时间 有哪些选项可以确定某些 PHP 代码的运行时间 我正在使用 zend 框架 Call microtime true 函数以毫秒分辨率获取当前时间
  • 统计数据库中的注册用户数

    我想反映在我的网站上注册的人数 只有我拥有的代码不起作用 它让我知道它不可能 转换为字符串 另外 当我将其设置为在 HTML 中调用的函数时 我收到 connection 未定义的错误 require once connect php sq
  • 如何将值发布到输入框中?

    Intro I would like to get the current time after clicking at click and POST the value into input text box Note 假设包含引导样式表
  • Symfony/Form:函数 DoctrineType::__construct() 的参数太少

    我有一个奇怪的错误 我在自己的系统中实现了 Form 组件 我在那里创建了一个 FormType 其中使用 EntityType 作为字段 每次我想用 formBuilder 创建表单时 它都会抛出以下错误 Fatal error Unca
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • 如果输入无效,是否可以抛出异常?

    我有一个简单的 ANLTR 语法和随附的访客 一切都很好 除非输入无效 如果输入无效 错误就会被吞噬 并且我的计算器会输出错误的输出 我尝试过实现一个错误侦听器 超越Recover词法分析器的方法 还有 好吧 今天还有六件事 有人可以告诉我
  • 重用 PDO 语句 var 会使进程崩溃

    我重用一个变量来存储两个不同的 PDO mysql 语句 stmt dbh gt prepare SELECT stmt gt execute stmt dbh gt prepare UPDATE crash here Error in o
  • Symfony 4 生产模式错误处理页面内存耗尽

    我将我的项目设置为prod模式在 env除了自定义错误页面之外的所有内容似乎都有效 我将此作为我的 404 树枝模板 templates bundles TwigBundle Exception error404 html twig inc
  • Monolog:通过邮件发送错误日志会导致每个发送的错误都会收到一封额外的邮件

    对于通过邮件发送的每个错误日志 我们都会收到另一封额外的电子邮件 其中包含 2 行 smtp 调试日志消息 新创建的 symfony 演示 symfony new demo 配置独白以通过邮件发送错误消息 如docs https symfo
  • 是否可以手动检查 LocateRegistry 是否存在?

    I 已经发现 https stackoverflow com a 8338852 897090一种安全的方式获得LocateRegistry 即使注册表尚不存在 Registry registry null try registry Loc
  • 多维数组 PHP 内爆 [重复]

    这个问题在这里已经有答案了 就我的数据结构而言 我有一个 communications 数组 每个 communications id 本身包含三部分信息 id score 和 content 我想内爆这个数组以获得逗号分隔的 id 列表
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • 检查字符串是否编码为 UTF-8

    function seems utf8 str length strlen str for i 0 i lt length i c ord str i if c lt 0x80 n 0 0bbbbbbb elseif c 0xE0 0xC0
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii

随机推荐