2010-01-15 18 views
11

Mam aplikację php, którą właśnie ponownie przeanalizowałem. Niestety wypluwają ostrzeżenia takie jak:Traktowanie ostrzeżeń jako błędy

Ostrzeżenie: preg_match() oczekuje parametr 2 będzie ciąg, obiekt podane w /home/yacoby/dev/netbeans/php/Zend/Db/Select.php on line 776

Co jest niemożliwe (lub bardzo ciężka praca), aby rozwiązać ten problem, ponieważ nie mam kodu wywołującego, więc nie mogę stwierdzić, które części kodu generują ostrzeżenie i jest dużo kodu.

Potrzebuję metody albo ostrzeżenia, jak błędy (W tym aplikacja umiera i drukuje stacktrace) lub potrzebuję stacktrace, aby pokazać się, gdy błędy drukowania. Czy istnieje metoda, aby to zrobić?

+2

Xdebug jest moim wyborem. – andyk

+0

Odpowiedź XDebug została przyjęta, ponieważ wygenerował najlepszy stacktrace (plus miał klikalne linki w moim IDE;)). Wszyscy pozostali otrzymali również +1 za dobre odpowiedzi, które wszystkie sprawdziły się dobrze. – Yacoby

+1

XDebug mówi o takiej funkcji tutaj http://xdebug.org/docs/stack_trace – naivists

Odpowiedz

4

Można zdefiniować własną obsługi błędu używając set_error_handler()

W funkcji obsługi można traktować każdą klasę błędu jednak chcesz. Oto podstawowy szablon, którego używam, w moim przypadku chcę tylko obsłużyć fatalne błędy, więc ignoruję powiadomienia i ostrzeżenia.

W twoim przypadku można zrobić ślad na ostrzeżenia lub zalogować je jednak chcesz

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

Następujących typów błędów nie można obsłużyć za pomocą funkcji zdefiniowanej przez użytkownika: ** E_ERROR **, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, i większość E_STRICT podniesiona w pliku, gdzie wywoływana jest funkcja set_error_handler(). - Mimo to przegłosowałem. – Gordon

+0

Ah, dzięki za informację. Zwykle używałem tego do obsługi USER_ERROR, ale nie wiedziałem, że nie może złapać E_ERROR, chociaż ma to sens, gdy się nad tym zastanowić. –

18

Patrz Przykład # 1 w 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

To całkiem fajne, nigdy nie myślałem o zrobieniu tego w ten sposób. –

+0

Myślę, że tak właśnie robi PHPUnit, aby zamienić zwykłe błędy, powiadomienia i ostrzeżenia w wyjątki PHPUnit Framework dotyczące błędów/ostrzeżeń/ostrzeżeń. – Gordon

+0

Nie wiem, czy jest "cool", ale z pewnością jest najłatwiejszy. : P –

9

Wystarczy popatrzeć na set_error_handler() i informuje o tym na początek skryptów lub w bootstrapie, aby wydrukować stos stacków, gdy wystąpi błąd E_WARNING.

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"); 

Aby uzyskać większą kontrolę nad różnymi typami, spójrz na bardziej przejrzystą wersję opublikowaną w innych miejscach w odpowiedziach.

Powiązane problemy