2011-08-13 77 views
5

通常PHP腳本會在E_NOTICE之後繼續運行,有沒有辦法在函數的上下文中將其提升爲致命錯誤,也就是說,我只需要在通知中僅退出函數而不是核心PHP函數,即全局函數。如何讓PHP退出E_NOTICE?

+3

爲什麼你需要限制它到你自己的功能?如果一個核心函數拋出一個E_NOTICE,那通常意味着你錯誤地使用它(在你自己的函數中)。所以我認爲你應該想要抓住所有的E_NOTICE。除非使用'trigger_error'手動觸發通知,否則應該觸發E_USER_NOTICE,這很容易區分。 – deceze

+1

我主要考慮讓我的職能退出E_NOTICE,至少其中一些職位。我認爲爲E_USER_NOTICE編寫例外是毫無意義的,因爲在這種情況下,任何程序員的目標都是將這個通知真正投入工作並繼續執行。 – rsk82

+1

「僅在我的函數中發出通知」您是否想要自己[觸發](http://il2.php.net/manual/en/function.trigger-error.php)?或者它們是你的函數中正常的「核心」E_NOTICE? –

回答

9

您可以創建自定義錯誤處理程序來捕獲E_NOTICE s。

這是未經測試,但要進入正確的方向:

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 

} 

然後,將其設置爲輸入時的功能,並恢復PHP的錯誤處理程序離開時,它使用set_error_handler()新的自定義錯誤處理程序:

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

「這是我只需要退出通知只在我的功能,但不是核心的PHP功能,這是全球性的」 –

+1

@Rududo這正是上述做的,不是嗎?什麼不見​​了? –

+1

他不希望它死在一個php核心E_NOTICE上,但只有一個E_USER_NOTICE由他的函數觸發:) –

2

您可以使用使用自定義錯誤處理程序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