gpt4 book ai didi

PHP(或其他): Strategy to deal with exceptions that "cannot occur"

转载 作者:行者123 更新时间:2023-12-04 16:31:20 25 4
gpt4 key购买 nike

考虑下面的代码。

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 标记。特别是如果它不是“允许”拥有一个,因为它正在实现一个不注释异常的接口(interface)。

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

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

最佳答案

在 Java 中。 “已检查”异常类和“未检查”异常类之间存在区别。只有经过检查的异常是接口(interface)契约的一部分,而即使接口(interface)没有声明,也允许抛出“未经检查的”异常。

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

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

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

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

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

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

关于PHP(或其他): Strategy to deal with exceptions that "cannot occur",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35586882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com