PHP Hata işleme: () ölmek Vs trigger_error() Vs atmak Hariç
PHP-Hata işleme için 3styles var bildiğim kadarıyla saygılar
die()
exit()
tarzı:$con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); }
throw Exception
tarzı:if (!function_exists('curl_init')) { throw new Exception('need the CURL PHP extension. Recomplie PHP with curl'); }
trigger_error()
tarzı:if(!is_array($config) && isset($config)) { trigger_error('Error: config is not an array or is not set', E_USER_ERROR); }
Şimdi, php manuel üç kullanılır.
Bilmek istediğim hangi stili ve neden tercih etmeliyim?
Bu 3 birbirinden değiştirmeleri düşmesi ve bu nedenle birbirinin yerine kullanılabilir.
Biraz OT: bana ya herkes hata işleme seçenekleri sadece PHP düşünüyor sadeceçok fazlaölçüde php geliştiricilerin kafasını karıştırıyor.
CEVAP
Birincisi asla son kullanıcılar (kullanıcı hakkında bir şey yapamaz . alakasız bir gezegene bilgiler olduğu üretim kodu kullanılmalıdır ^em>"Veritabanına bağlanamıyor").
Eğer bazı kod kritik bir noktada olduğunu biliyorum eğer özel Durumlar, uygulama atmakbaşarısız olabilirve kodunuz birden fazla çağrı seviyeleri kurtarmak istediğiniz.
trigger_error()
sağlar ince taneli hata raporlama (kullanarak farklı düzeylerde hata iletileri) ve gizlemek bu hataları son kullanıcılar (kullanarak set_error_handler()
) ama hala onları görüntülenmesi için test sırasında.
Ayrıca trigger_error()
önemli olmayan mesajları üretim kodu özel hata işleyicisi kullanarak bastırılmış gelişiminde önemli rol oynar üretebilir. Ölümcül hataları da üretebilir (E_USER_ERROR
) ama bu kurtarılabilir değil. Eğer bunlardan birini tetiklemesi, yürütme programıdururbu noktada. Bu, önemli hatalar, İstisnalar kullanılmalıdır nedeni budur. Bu şekilde, programın akışı üzerinde daha fazla kontrole sahip olacak:
// Example (pseudo-code for db queries):
$db->query('START TRANSACTION');
try {
while ($row = gather_data()) {
$db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
}
$db->query('COMMIT');
} catch(Exception $e) {
$db->query('ROLLBACK');
}
Burada, eğer gather_data()
sadece düz nalları dikti (kullanarak E_USER_ERROR
die()
) bir şans, bir önceki INSERT
tablolar yapardı içine veritabanınızda olmasa dahi, istenen ve sen üzerinde hiçbir kontrolü ne de başına gelecek.
Hata işleme teorisi?...
Hata ASP.NET MVC İşleme...
VBScript Kullanarak hata işleme...
Bir MySQL tetikleyici bir hata atmak...
Neden't tarayıcıları başka bir ke...