Хотите знать, сколько усилий я должен приложить для принудительного использования полезной информации отладки при создании сообщений об исключениях, или я должен просто доверить пользователю предоставление правильной информации или отложить сбор информации до обработчика исключений?
Я вижу, как много людей делают исключения:
throw new RuntimeException('MyObject is not an array')
или расширение исключений по умолчанию с помощью пользовательских исключений, которые мало что делают, но меняют имя исключения:
throw new WrongTypeException('MyObject is not an array')
Но это не дает много отладочной информации ... и не требует какого-либо форматирования с сообщением об ошибке. Таким образом, вы можете получить точно такую же ошибку, которая выдаст два разных сообщения об ошибке ... например, "Ошибка подключения к базе данных" против "Не удалось подключиться к базе данных"
Конечно, если он всплывает наверх, он напечатает трассировку стека, что полезно, но не всегда говорит мне все, что мне нужно знать, и обычно мне приходится начинать снимать с var_dump () операторы, чтобы узнать, что пошло не так и где ... хотя это может быть несколько компенсировано приличным обработчиком исключений.
Я начинаю думать о чем-то вроде приведенного ниже кода, где мне требуется метатель исключения для предоставления необходимых аргументов для получения правильного сообщения об ошибке. Я думаю, что это может быть путь к этому:
- Минимальный уровень полезной информации должен быть предоставлен
- Создает несколько непротиворечивые сообщения об ошибках
- Шаблоны для сообщений об исключениях все в одном месте (классы исключений), так что проще обновлять сообщения ...
Но я вижу недостаток в том, что их сложнее использовать (требует, чтобы вы посмотрели определение исключений), и, таким образом, они могли бы отговорить других программистов использовать предоставленные исключения ...
Я хотел бы прокомментировать эту идею и лучшие практики для согласованной, гибкой структуры сообщений об исключениях.
/**
* @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#
И ничего подобного не упоминается, так что, может быть, это плохая идея ...