Edit report at https://bugs.php.net/bug.php?id=64313&edit=1

 ID:                 64313
 Comment by:         mattsch at gmail dot com
 Reported by:        mattsch at gmail dot com
 Summary:            DateTime & DateTimeZone constructs should emit
                     DateTimeException
 Status:             Open
 Type:               Feature/Change Request
 Package:            Date/time related
 PHP Version:        5.3.22
 Block user comment: N
 Private report:     N

 New Comment:

Forget the $format part of the test script.  I changed the class slightly to 
show a simplified form of the problem.


Previous Comments:
------------------------------------------------------------------------
[2013-02-27 18:46:31] mattsch at gmail dot com

Description:
------------
DateTime and DateTimeZone constructs currently emit Exception but they should 
really emit an exception related to their respective classes.  The reason for 
this is the code can run in multiple environments (ui, phpunit, etc).  If I 
want the exception to bubble up to the base exception in my application 
environment, I want to catch it and rethrow it with an exception that 
ultimately extends my app base exception.  As a result, I must catch the base 
php Exception class and rethrow it with the wrapper exception which extends my 
base app exception.  The problem comes when I try to run testcases on the class 
in the phpunit environment.  Since phpunit emits exceptions, catching Exception 
will also catch phpunit environment exceptions which is not what I want.  As a 
result, I must check the instance of the exception and allow phpunit exceptions 
to go through unchanged.  If the DateTime and DateTimeZone classes did not 
throw Exception, then this would not be a problem.  In fact, I don't think any 
php command should actually throw the main php Exception and should always 
throw an exception that is extended from Exception to avoid problems like this.

Test script:
---------------
<?php
class DateTimeWrapper
{
        private $dateTime;

        public function __construct($time = 'now', DateTimeZone $timezone = 
null, $format = null)
        {
                $this->setDateTime($time, $timezone, $format);
        }
        public function setDateTime($time = 'now', DateTimeZone $timezone = 
null, $format = null)
        {
                try {
                        $this->dateTime = new DateTime($time, $timezone);
                }
                catch (Exception $e) {
                        /*
                                PHP DateTime really shouldn't throw the catch 
all Exception so the workaround is
                                to keep this from catching phpunit exceptions 
as well so do instance checks on it.
                        */
                        // @codeCoverageIgnoreStart
                        if ($e instanceof PHPUnit_Framework_Error
                                || $e instanceof PHPUnit_Framework_Exception) {
                                throw $e;
                        }
                        // @codeCoverageIgnoreEnd
                        throw new DateTimeWrapperException($e->getMessage(), 
$e->getCode(), $e);
                }
        }
}

Expected result:
----------------
php should not throw Exception directly but rather an exception that extends 
Exception.

Actual result:
--------------
php throws Exception in places like DateTime and DateTimeZone when it should 
really throw an exception like DateTimeException instead which would extend 
Exception.


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=64313&edit=1

Reply via email to