子类化异常

tak*_*hin 2 php error-handling zend-framework exception-handling exception

我们都同意,为不同的任务使用不同的异常类型是要走的路.

但是,我们最终创建了像这样的ghost文件:

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Dojo
 * @subpackage View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
 */

/**
 * @see Zend_Dojo_Exception
 */
require_once 'Zend/Dojo/Exception.php';

/**
 * @category   Zend
 * @package    Zend_Dojo
 * @subpackage View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Dojo_View_Exception extends Zend_Dojo_Exception
{
}
Run Code Online (Sandbox Code Playgroud)

然后Zend_Dojo_Exception同样的Zend_Exception... 和相同的......

这个问题有没有通用的方法?

有点像throw new \My\Just\Declared\Exception\ (which extends \My\Just\Exception),所以我没有必须包装并要求所有那些鬼文件?

wei*_*ney 7

您似乎专注于这些"鬼"类的想法 - 没有实现的类或标记接口.坦率地说,你错过了这一点.

在ZF1中,Exception类仅是组件级别,该级别的所有异常都接收相同的异常类.这实际上只允许以下类型的捕获:

  • 全球水平(捕获"例外")
  • 组件级别(捕获组件级别异常)

这只比在任何地方简单地抛出"例外"略胜一筹; 您需要仔细检查异常消息,以了解出现了什么问题.

现在,仔细阅读提案.

提案的要点是在捕获异常时允许更多级别的粒度:

  • 不在乎它是什么例外?Catch\Exception.
  • 寻找特定组件的异常,但不关心除此之外的细节?捕获该组件的Exception接口.
  • 想要寻找特定类型的SPL例外吗?抓住那些(在ZF2中,异常类实现组件异常接口,并扩展适当的SPL异常).
  • 想要捕获组件中的特定异常类型?抓住它吧.

基本上,我们现在只允许异常TYPE上的更大粒度; 如果您尝试的操作可能抛出多个相同类型的异常,则只需要检查消息.通常情况下,情况并非如此.

SPL异常在语义上相当丰富,并且ZF中的许多异常将更好地归类为这些类型(例如,无效参数应该引发InvalidArgumentException;无法解析插件将是一个很好的RuntimeException;等等).使用ZF1,这是不可能的 - 我们必须继承组件级异常,句点.通过移动到标记接口,我们既可以捕获组件级异常以及SPL级别,也可以获得更具体的异常类型.