2011-08-13 18 views
5

Zwykle skrypt php działa po E_NOTICE, czy istnieje sposób na podniesienie tego błędu do krytycznego błędu w kontekście funkcji, to znaczy, że muszę tylko wyprowadzać powiadomienia tylko w moich funkcjach, ale nie w podstawowych funkcjach php, czyli globalnie .jak zrobić wyjście php na E_NOTICE?

+3

Dlaczego trzeba ograniczyć to do własnych funkcji? Jeśli podstawowa funkcja zgłasza E_NOTICE, zazwyczaj oznacza to, że używasz go nieprawidłowo (w twojej własnej funkcji). Myślę więc, że powinieneś chcieć złapać wszystkie E_NOTICE. O ile nie uruchomisz ręcznego wyzwalania za pomocą 'trigger_error', w takim przypadku powinieneś wywołać E_USER_NOTICE, co łatwo jest rozróżnić. – deceze

+1

Przede wszystkim myślałem o tym, aby wyjść z E_NOTICE na moje funkcje, przynajmniej niektóre z nich. Myślę, że nie ma sensu pisać wyjątków dla E_USER_NOTICE, ponieważ w tym przypadku każdy programista dąży do tego, aby naprawdę wprowadzić to zawiadomienie do pracy i kontynuować wykonywanie. – rsk82

+1

"Zawiadomienia tylko w moich funkcjach" Czy masz na myśli, że chcesz je sam wywołać (http://il2.php.net/manual/en/function.trigger-error.php)? lub są one normalnym "rdzeniem" 'E_NOTICE', które występują w twoich funkcjach? –

Odpowiedz

9

Można utworzyć niestandardową procedurę obsługi błędów, aby przechwycić E_NOTICE s.

To niesprawdzone ale powinno iść w dobrym kierunku:

function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    if ($errno == E_USER_NOTICE) 
    die ("Fatal notice"); 
    else 
    return false; // Leave everything else to PHP's error handling 

} 

następnie ustawić ją jako nową klasę obsługi błędów przy użyciu set_error_handler() podczas wprowadzania funkcji i przywrócić obsługi błędów PHP przy opuszczaniu go:

function some_function() 
{ 

// Set your error handler 
$old_error_handler = set_error_handler("myErrorHandler"); 

... do your stuff .... 

// Restore old error handler 
set_error_handler($old_error_handler); 

} 
+1

"potrzebuję tylko wyjść z powiadomienia tylko w moich funkcjach, ale nie w podstawowych funkcjach php, to jest globalnie" –

+1

@Rikudo Dokładnie to, co powyższe robi, prawda? Czego brakuje? –

+1

On nie chce, żeby umarł na php core E_NOTICE, ale tylko E_USER_NOTICE wywołane przez jego funkcje :) –

2

użyć niestandardowej procedury obsługi błędu używając set_error_handler()

<?php 

    function myErrorHandler($errno, $errstr, $errfile, $errline) { 
     if ($errno == E_USER_NOTICE) { 
      die("Died on user notice!! Error: {$errstr} on {$errfile}:{$errline}"); 
     } 
     return false; //Will trigger PHP's default handler if reaches this point. 
    } 

    set_error_handler('myErrorHandler'); 

    trigger_error('This is a E_USER_NOTICE level error.'); 
    echo "This will never be executed."; 


?> 

Working Example

Powiązane problemy