- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我正在构建的框架中,我正在努力使我的代码更具可测试性,因为我之前沉迷于 MVC+Singleton 模式并且拥有大量的静态类。从那时起,我开始更多地了解单元测试和 TDD,这促使我重构了很多代码。这种重构的一部分促使我尝试在 PHP 中正确使用扩展类,即不仅抛出 Exception 类,而且抛出更多相关的异常。
我有以下类(class):
<?php
namespace Framework;
class Uri {
public static function new_from_http() {
$uri = '';
if (isset($_SERVER['REQUEST_URI'])) {
$uri = $_SERVER['REQUEST_URI'];
} elseif (isset($_SERVER['PATH_INFO'])) {
$uri = $_SERVER['PATH_INFO'];
}
return static::new_from_string($uri);
}
public static function new_from_string($string) {
return new static(explode('/', $string));
}
protected $uri = [];
public function __construct(array $uri) {
$this->uri = array_values(array_filter($uri));
}
public function get_segment($offset, $default = null) {
if (!is_int($offset)) {
throw new \InvalidArgumentException(
sprintf('%s requires argument 1 to be an integer, %s given.',
__METHOD__,
gettype()
)
);
}
return isset($this->uri[$offset - 1])
? $this->uri[$offset - 1]
: $default;
}
}
一切都很好,如您所见,get_segment 方法需要一个整数,否则它会抛出 InvalidArgumentException。问题是,我想再创建一些方法,这些方法也需要整数作为参数,而且我不想在任何地方剪切和粘贴该代码。合并所有这些类型的参数检查的最佳选择是什么,以便我可以在不同的类和方法中使用它们,同时保持消息彼此一致。
我的一个想法是在框架命名空间下扩展异常类,并让构造函数采用不同的参数,例如:
namespace Framework;
class InvalidArgumentException extends \InvalidArgumentException {
public function __construct($method, $argument, $value) {
parent::__construct(
sprintf('%s requires argument 1 to be an integer, %s given.',
$method,
gettype($value)
)
);
}
}
这会被称为:
if (!is_int($arg)) {
throw new \Framework\InvalidArgumentException(__METHOD__, 1, $arg);
}
还可以改进 \Framework\InvalidArgumentException
可以通过回溯获取 __METHOD__
值。
我还有哪些其他选择,最好的是什么?
最佳答案
我会将 /InvalidArgumentException
扩展为 NonIntegerException
,否则做的事情基本相同。这样,如果您需要 strings
、arrays
或任何其他类型,您就可以创建新的异常,而不必用疯狂的逻辑来确定哪个消息使用。
关于PHP DRY 抛出 InvalidArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358404/
我正在使用 JWS 库来取消签署一些 token ,因此当 token 无效时,我得到了异常 InvalidArgumentException ({ "name": "Exception", "mes
我正在使用 JWS 库来取消签署一些 token ,因此当 token 无效时,我得到了异常 InvalidArgumentException ({ "name": "Exception", "mes
我正在使用 Behat 进行一些自动化测试,并且添加了 Mink 及其 Goutte 驱动程序。我使用的是最新版本的 Behat 和 Mink。 我已将 Mink 扩展添加到功能上下文文件中,当我运行
我正在研究 Restful API,当我想在数据库中播种假数据时出现异常消息。 我更新数据库。 php artisan migrate:fresh 我在数据库上播种。 php artisan db:s
我正在尝试创建一个 Doctrine 实体: php app/console doctrine:generate:entity --entity="AWStudio:Category" --field
请说明如何从下面的函数创建测试用例以测试异常和消息是否正确抛出。我正在使用 Symfony 2。 public function validateParams(Graph $graph, $start
我正在尝试使用以下命令从 composer.json 文件安装 symfony 2.4.1: php composer.phar install 我从包含 composer.json 文件 (var/
我将项目从本地主机上传到我的专用服务器,在遇到很多问题之后,终于有一些页面可以在 domain.com 上运行 |域名.com/home | domain.com/allsites 等.. 但是现在,
目标 像在 Java 或类似语言中那样在 JavaScript 方法中抛出 InvalidArgumentException。 背景 我一直在尝试熟悉 JavaSctipt 错误处理,我知道我可以使用
我在 packagist 中为 Composer 准备的第一个包。我实际上是为我自己的项目编写的,但我不能在任何地方使用它! 当我这样做 composer require wearede/tbcpay
在我正在构建的框架中,我正在努力使我的代码更具可测试性,因为我之前沉迷于 MVC+Singleton 模式并且拥有大量的静态类。从那时起,我开始更多地了解单元测试和 TDD,这促使我重构了很多代码。这
我应该什么时候使用 InvalidArgumentException什么时候UnexpectedValueException ?它们在我看来是一样的。 Note一个扩展了 LogicException
我正在尝试获取 HTTP 状态码 用 Python 用 selenium webdriver 打开一个网站后,我看到了 HTTP 状态码 不可能,所以唯一的方法是获取网络日志并获取 HTTP 状态码
我正在开发一个需要与驱动器/电子表格交互的 android 应用程序。我正在使用 google drive for android API,但它不仅太复杂而无法弄清楚,而且它从来没有正常工作。所以我切
嗨,我尝试了在 Google 上找到的所有内容,但没有任何效果,当我尝试在数据库中插入日期时,我总是出现错误跟踪数据。我希望有一个人可以帮助我。非常感谢,并对我的英语感到抱歉。 //这是我的模型位置
我正在使用 VisualStudio 12 开发一个应用程序。在那个应用程序中我需要做一些 mySql 调用,我有代码: sql::Statement *stmt = db->global->crea
我刚刚从 bitbucket 克隆了一个 laravel 项目,我正在为我的本地开发人员使用 nginx 服务器。但是当我导航到我的项目的 url(本地)时,我收到了这个错误。 请帮忙! 最佳答案 在
我试图在 symfony 2 应用程序中创建我的第一个服务,但我收到此错误: InvalidArgumentException: There is no extension able to load
我正在使用 official documentation for symfony 2.1用于覆盖默认的 FOSUserBundle 表单。但是当我试图覆盖表单处理程序时,我遇到了这个错误: Inval
我正在尝试解决 Laravel 日程安排的一个奇怪问题: ERROR: exception 'InvalidArgumentException' with message 'Invalid sched
我是一名优秀的程序员,十分优秀!