2009/12/11 Hannes Magnusson <[email protected]>:
> On Fri, Dec 11, 2009 at 23:39, Randall Girard <[email protected]>
> wrote:
>> Okay, my mistake.
>>
>>
>> E_USER_WARNING and E_USER_NOTICE are supposed to continue execution,
>> correct?
>
> Correct.
>
>
>> ThenĀ I will restate what I previously said. throwing ErrorException from an
>
> No no. Stop there. Exceptions are *totally* different from E_*.
>
>
>> ERROR_HANDLER(...) is useless iwht E_USER_WARNING and E_USER_NOTICE. Why?
>> Because when you throw the exception from the ERROR_HANDLER, presumably it
>> may NOT get caught in a try/catch block. Therefor the execution cannot
>> continue.
>
> Exactly. And that is the point.
> Why would you be turning E_USER_* into exceptions if you don't want to
> bail out of the current scope?
>
> If you throw an exception from the error handler, what exactly do you
> expect to happen?
> I gave several reasons for why that simply is impossible, but I am
> curious: what exactly are you expecting?
>
>
>
>> Therefor, I think that either a check to see if the TRY/CATCH has been
>> initiated further up the call stack, or a function to call from within the
>> EXCEPTION_HANDLER that will return execution to the previous scope.
>>
>>
>> I don't see how this is difficult to understand.
>
> So you expect a scripting language to scroll up the entire execution
> chain to see if there is a catch() block at all, and if there is no
> catch() block, the simply ignore the exception and continue?
> If thats your expectations then you are severely misunderstanding the
> concept of exceptions.
>
>
> Please do "reply-all". And please do not top-post.
>
>
> -Hannes
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
In support of Hannes, and hopefully providing a simpler script to show
what is happening.
-----------script------------
<?php
function uncaught_exception_handler(Exception $e) {
echo 'Exception : ', $e->getMessage(), PHP_EOL;
}
function uncaught_error_handler($i_ErrNo, $s_Error, $s_File, $i_Line,
$a_Context) {
echo 'A PHP error has been generated. It will be turned into an
exception.', PHP_EOL;
switch($i_ErrNo) {
case 0 : $s_ErrNo = '@'; return True; break;
case 1 : $s_ErrNo = 'E_ERROR'; break;
case 2 : $s_ErrNo = 'E_WARNING'; break;
case 4 : $s_ErrNo = 'E_PARSE'; break;
case 8 : $s_ErrNo = 'E_NOTICE'; break;
case 16 : $s_ErrNo = 'E_CORE_ERROR'; break;
case 32 : $s_ErrNo = 'E_CORE_WARNING'; break;
case 64 : $s_ErrNo = 'E_COMPILE_ERROR'; break;
case 128 : $s_ErrNo = 'E_COMPILE_WARNING'; break;
case 256 : $s_ErrNo = 'E_USER_ERROR'; break;
case 512 : $s_ErrNo = 'E_USER_NOTICE'; break;
case 1024 : $s_ErrNo = 'E_USER_NOTICE'; break;
case 2048 : $s_ErrNo = 'E_STRICT'; break;
case 4096 : $s_ErrNo = 'E_RECOVERABLE_ERROR'; break;
case 8192 : $s_ErrNo = 'E_DEPRECATED'; break;
case 16384 : $s_ErrNo = 'E_USER_DEPRECATED'; break;
}
throw new Exception("PHP Error : $s_Error ($s_ErrNo) in $s_File at
Line $i_Line", $i_ErrNo);
// Never reached as execution continues in the "catch" clause or by
a uncaught exception handler.
echo 'The exception has been thrown.', PHP_EOL;
}
set_error_handler('uncaught_error_handler');
set_exception_handler('uncaught_exception_handler');
try {
echo 'About to divide by zero inside a try/catch.', PHP_EOL;
$a = 1 / 0;
} catch(Exception $e) {
echo 'Caught : ', $e->getMessage(), PHP_EOL;
}
echo 'Caught divide by zero E_WARNING.', PHP_EOL, PHP_EOL;
echo 'About to divide by zero without a safety net.', PHP_EOL;
$b = 1 / 0;
// Never reached as we are not catching the execption thrown by the
uncaught error handler
echo 'Un-caught divide by zero E_WARNING.', PHP_EOL;
?>
-----------script------------
outputs ...
--------output---------
About to divide by zero inside a try/catch.
A PHP error has been generated. It will be turned into an exception.
Caught : PHP Error : Division by zero (E_WARNING) in Z:\test_error.php
at Line 36
Caught divide by zero E_WARNING.
About to divide by zero without a safety net.
A PHP error has been generated. It will be turned into an exception.
Exception : PHP Error : Division by zero (E_WARNING) in
Z:\test_error.php at Line 44
--------output---------
The whole issue is that you are using the (and I can't stress this
enough) _UNCAUGHT_ handlers.
These are the last ditch attempt / safety net for your code. It is
STILL your responsibility to pre-detect the potential errors and code
around them.
A try/catch block will be enough, as demonstrated - I successfully
capture a divide by zero.
Richard.
--
-----
Richard Quadling
"Standing on the shoulders of some very clever giants!"
EE : http://www.experts-exchange.com/M_248814.html
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
ZOPA : http://uk.zopa.com/member/RQuadling
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php