想知道在创建异常消息时我应该付出多大的努力来强制使用有用的调试信息,还是我应该只信任用户提供正确的信息,还是将信息收集推迟到异常处理程序中?
我看到很多人在做他们的例外,例如:
throw new RuntimeException('MyObject is not an array')
或使用自定义异常扩展默认异常,这些自定义异常不会做很多事情,但会更改异常的名称:
throw new WrongTypeException('MyObject is not an array')
但这并没有提供太多的调试信息...并且不对错误消息进行任何格式的设置。因此,您最终可能会得到完全相同的错误,并产生两个不同的错误消息...例如,“数据库连接失败”与“无法连接到数据库”
当然,如果它冒泡到顶部,它将打印堆栈跟踪,这很有用,但是它并不总是告诉我我需要知道的所有信息,通常我最终不得不开始拍摄var_dump()语句才能发现出了什么问题以及在哪里...尽管这可以通过一个体面的异常处理程序来弥补。
我开始考虑下面的代码,在该代码中,我要求异常的抛出者提供必要的arg以产生正确的错误消息。我认为这可能是解决问题的方法:
- 必须提供最低级别的有用信息
- 产生一些一致的错误消息
- 异常消息的模板全部集中在一个位置(异常类),因此更容易更新消息...
但是我看到的缺点是它们更难使用(要求您查找异常定义),因此可能会阻止其他程序员使用提供的异常。
我想对这个想法以及关于一致,灵活的异常消息框架的最佳实践进行一些评论。
/**
* @package MyExceptions
* MyWrongTypeException occurs when an object or
* datastructure is of the incorrect datatype.
* Program defensively!
* @param $objectName string name of object, eg "\$myObject"
* @param $object object object of the wrong type
* @param $expect string expected type of object eg 'integer'
* @param $message any additional human readable info.
* @param $code error code.
* @return Informative exception error message.
* @author secoif
*/
class MyWrongTypeException extends RuntimeException {
public function __construct($objectName, $object, $expected, $message = '', $code = 0) {
$receivedType = gettype($object)
$message = "Wrong Type: $objectName. Expected $expected, received $receivedType";
debug_dump($message, $object);
return parent::__construct($message, $code);
}
}
....
/**
* If we are in debug mode, append the var_dump of $object to $message
*/
function debug_dump(&$message, &$object) {
if (App::get_mode() == 'debug') {
ob_start();
var_dump($object);
$message = $message . "Debug Info: " . ob_get_clean();
}
}
然后像这样使用:
// Hypothetical, supposed to return an array of user objects
$users = get_users(); // but instead returns the string 'bad'
// Ideally the $users model object would provide a validate() but for the sake
// of the example
if (is_array($users)) {
throw new MyWrongTypeException('$users', $users, 'array')
// returns
//"Wrong Type: $users. Expected array, received string
}
我们可能会在自定义异常处理程序中执行类似nl2br的操作,以使html输出变得更好。
正在阅读:http : //msdn.microsoft.com/en-us/library/cc511859.aspx#
而且没有提及这样的事情,所以也许这是一个坏主意...
RuntimeException::__construct()