2010-01-15 33 views
11

Sadece yeniden faktörlendirdiğim bir php uygulamasına sahibim.Uyarıları Hata Olarak İşleme Etme

Uyarı: gibi Ne yazık ki bu üzerinden püsküren uyarılar preg_match'in() parametresi 2 hattı 776

üzerinde /home/yacoby/dev/netbeans/php/Zend/Db/Select.php belirli bir dize, nesne olmasını bekler

Aramayla ilgili bir sorunum olmadığı için bu sorunu çözmek imkansız (ya da çok zor bir iş), bu nedenle kodumun hangi bölümlerinin uyarıya neden olduğunu anlayamıyorum ve çok fazla kod var.

Hatalar gibi uyarıları işlemek için bir yönteme ihtiyacım var (Uygulamada öter ve stacktrace yazdırılır) veya yazdırma hataları sırasında gösterilecek stacktrace'e ihtiyacım var. Bunu yapmak için bir yöntem var mı?

+2

Xdebug benim seçimim. – andyk

+0

XDebug cevabı en iyi stacktrace'i ürettiği için kabul edildi (ayrıca IDE'mde tıklanabilir linkler vardı;)). Tüm diğerleri iyi çalıştı, iyi cevaplar için +1 var. – Yacoby

+1

XDebug burada böyle bir özellik hakkında konuşuyor http://xdebug.org/docs/stack_trace – naivists

cevap

4

Sen ancak istediğiniz her hata sınıfını tedavi edebilir işleyici işlevinde set_error_handler()

kullanarak kendi hata işleyicisi tanımlayabilirsiniz. İşte kullanıyorum temel bir şablon, benim durumumda sadece ölümcül hataları işlemek istiyorum, bu yüzden uyarıları ve uyarıları göz ardı ediyorum. Senin durumunda

Eğer uyarıları üzerine Geri izleme yapmak veya ancak

function error_handler($errno,$message,$file,$line,$context) { 

switch($errno) { 
    // ignore warnings and notices 
    case E_WARNING: 
    case E_NOTICE: 
    case E_USER_NOTICE: 
    case E_USER_WARNING: 
     break; 
    // log PHP and user errors 
    case E_ERROR: 
    case E_USER_ERROR: 
       // Do some processing on fatal errors 
    } 
} 
+1

Aşağıdaki hata türleri kullanıcı tanımlı bir işlevle ele alınamıyor: ** E_ERROR **, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING ve set_error_handler() öğesinin çağrıldığı dosyada E_STRICT'nin çoğunu kaldırdı. - Ama yine de reddettim. – Gordon

+0

Ah, bilgi için teşekkürler. Normalde bunu USER_ERROR ile çalışmak için kullandım, ancak E_ERROR'u yakalayamadığının farkında değildi, bunun hakkında düşündüğünüzde anlamlıdır. –

18

http://www.php.net/manual/en/class.errorexception.php

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 
+0

Oldukça havalı, asla böyle yapmayacağını düşündüm. –

+0

PHPUnit, PHPUnit Framework hata/uyarı/uyarı istisnalarına normal hataları, uyarıları ve uyarıları döndürmek için böyle yapar. – Gordon

+0

"Serin" olup olmadığını bilmiyorum, ama kesinlikle en kolaysı. : P –

9

de örnek 1. Bkz istiyorum set_error_handler() göz at ve bu dahil edip kaydedeceksiniz olabilir E_WARNINGs gerçekleştiğinde, stacktrace'i yazdırmak için komut dosyalarınızın veya bootstrap'inizin başlangıcı.

çeşitli türleri üzerinde daha fazla kontrol için
function stacktrace_error_handler($errno,$message,$file,$line,$context) 
{ 
    if($errno === E_WARNING) { 
     debug_print_backtrace(); 
    } 
    return false; // to execute the regular error handler 
} 
set_error_handler("stacktrace_error_handler"); 

, cevapları başka yerlere gönderilmiş daha açık bir sürümü de bakabilirsiniz.