Ben özel durum iletilerini oluştururken yararlı hata ayıklama bilgileri zorlamak için ne kadar çaba gitmeli merak, ya da sadece doğru bilgi sağlamak veya bir istisna işleyicisi toplama bilgileri erteleme kullanıcıyı güvenmeliyiz?
Ben gibi onların durumları yapan insanlar bir sürü insan görürsünüz:
throw new RuntimeException('MyObject is not an array')
veya çok yapmak ancak istisna adını değiştirmeyin özel istisnalar dışında varsayılan istisnalar uzanan:
throw new WrongTypeException('MyObject is not an array')
Ama bu ... çok hata ayıklama bilgi kaynağı değildir ve hata mesajı ile biçimlendirme her türlü zorlamaz. Yani tam olarak aynı hata iki farklı hata iletileri üretme ile bitebileceğini ... örn vs "Veritabanı bağlantısı başarısız oldu" "db bağlanamıyor"
Tabii, üst kabarcıklar, eğer yararlı olduğu, yığın izleme basalım, ama her zaman keşfetmek için) bana ifadeleri bilmek gerekiyor ve genellikle ben (var_dump kapalı çekim başlamak zorunda sona her şeyi söylemek değil ne bu biraz iyi bir istisna işleyicisi ile telafi edilebilir ama ... yanlış ve nerede gitti.
Ben istisna require atıcı doğru hata mesajı üretmek için gerekli argümanlarımdan sağlamak için aşağıdaki kodu gibi bir şey, düşünmeye başlıyorum. Ben bu o gitmek için yol olabilir düşünüyorum:
- Yararlı bilgi minimum düzeyde sağlanmalıdır
- Biraz tutarlı hata iletileri üretir
- Istisna mesajları için kalıplar bir konum (istisna sınıfları), daha kolay mesajları güncellemek için böylece tüm ...
Ama (eğer istisna tanımı bakmak gerekir), ve dolayısıyla sağlanan istisnalar kullanarak diğer programcılar vazgeçirmek olabilir olumsuz da kullanmak zor olduğu varlık görmek ...
Ben bu fikri bazı yorum istiyorum, ve istiyorum tutarlı, esnek bir istisna mesajı çerçevesi için en iyi uygulamaları.
/**
* @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();
}
}
Sonra eskisi gibi:
// 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
}
ve biz html çıkışı için güzel şeyler yapmak için bir özel durum işleyici bir nl2br gibi bir şey yapmak gerekebilir.
Been reading: http://msdn.microsoft.com/en-us/library/cc511859.aspx#
Ve orada böyle bir şey hiç bahsedilmemesi, bu yüzden belki de kötü bir fikir ...