假设我的CakePHP APP中有一个实用程序类。很简单,这个实用程序允许我执行一些任务 该实用程序可能会像任何其他类一样生成一些异常。
现在我正在创建一个shell,这个shell也使用这个实用程序 然后使用shell,可以生成异常。 在我的终端中,这些异常与应用程序布局一起显示。
所以我的问题是:我如何正确处理这些例外?
在shell中我应该实现一些早期发生的构造,并避免使用此实用程序可能会抛出异常吗?
实际例子:
我的实用程序允许您创建数据库备份。我希望它是一个实用程序,因为它可以在多个上下文中使用,例如也可以在控制器中使用(在应用程序的管理面板中,您可以执行数据库备份)。
在许多其他方面,该实用程序会检查您创建备份的目录是否可写,以及它是否不会抛出异常。
现在,如果我在shell中使用该实用程序,并且如果我尝试在不可写目录中创建备份,则抛出此异常。
这是对的吗?也许在shell中我应该在使用该实用程序之前检查目录是否可写,然后我应该使用Cake\Console\Shell::abort()
方法?但是,通过这种方式,我将不得不两次实现相同的代码。
感谢。
修改
一些 愚蠢的 代码示例,只是为了让您了解我在说什么。
class MyUtility {
public function create($filename, $data) {
if(!is_writable(dirname($filename)))
throw new InternalErrorException(__('File or directory `{0}` not writeable', dirname($filename)));
return file_put_contents($filename, $data);
}
}
class MyStupidShell extends Shell {
public function main() {
if($this->param('filename') && $this->param('data')) {
$this->out(__('Ok, I will create the file {0}', $this->param('filename')));
MyUtility::create($this->param('filename'), $this->param('data'));
}
}
}
$ bin/cake MyStupid --filename /not/writable/directory/myfile.txt --data "hello world"
答案 0 :(得分:0)
正如@ndm所建议的那样:
class MyUtility {
public function create($filename, $data) {
if(!is_writable(dirname($filename)))
throw new InternalErrorException(__('File or directory `{0}` not writeable', dirname($filename)));
return file_put_contents($filename, $data);
}
}
class MyStupidShell extends Shell {
public function main() {
if($this->param('filename') && $this->param('data')) {
try {
$this->out(__('Ok, I will create the file {0}', $this->param('filename')));
MyUtility::create($this->param('filename'), $this->param('data'));
}
catch(InternalErrorException $e) {
$this->abort($e->getMessage());
}
}
}
}
$ bin/cake MyStupid --filename /not/writable/directory/myfile.txt --data "hello world"