]> granicus.if.org Git - php/commitdiff
Use ValueError instead of exceptions in SPL extension
authorGeorge Peter Banyard <girgias@php.net>
Sat, 12 Sep 2020 01:00:53 +0000 (03:00 +0200)
committerGeorge Peter Banyard <girgias@php.net>
Tue, 15 Sep 2020 10:49:59 +0000 (12:49 +0200)
14 files changed:
ext/spl/spl_directory.c
ext/spl/spl_fixedarray.c
ext/spl/spl_iterators.c
ext/spl/tests/DirectoryIterator_empty_constructor.phpt
ext/spl/tests/SplFileObject_seek_error_001.phpt
ext/spl/tests/bug51119.phpt
ext/spl/tests/fileobject_setmaxlinelen_error001.phpt
ext/spl/tests/fixedarray_021.phpt
ext/spl/tests/iterator_028.phpt
ext/spl/tests/iterator_037.phpt
ext/spl/tests/recursive_tree_iterator_008.phpt
ext/spl/tests/regexIterator_setMode_error.phpt
ext/spl/tests/spl_caching_iterator_constructor_flags.phpt
ext/spl/tests/spl_limit_iterator_check_limits.phpt

index 0348a20d3451612707b89c6441388cd9b21a7eb9..cc5e4b7ac4849f41d5f8951a8acfa33cc2f9aee6 100644 (file)
@@ -720,19 +720,19 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto
                flags |= SPL_FILE_DIR_UNIXPATHS;
        }
        if (parsed == FAILURE) {
-               return;
+               RETURN_THROWS();
        }
 
-       if (!len) {
-               zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Directory name must not be empty.");
-               return;
+       if (len == 0) {
+               zend_argument_value_error(1, "cannot be empty");
+               RETURN_THROWS();
        }
 
        intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
        if (intern->_path) {
                /* object is already initialized */
                zend_throw_error(NULL, "Directory object is already initialized");
-               return;
+               RETURN_THROWS();
        }
        intern->flags = flags;
 
@@ -2277,7 +2277,7 @@ PHP_METHOD(SplFileObject, setMaxLineLen)
        }
 
        if (max_len < 0) {
-               zend_throw_exception_ex(spl_ce_DomainException, 0, "Maximum line length must be greater than or equal zero");
+               zend_argument_value_error(1, "must be greater than or equal to 0");
                RETURN_THROWS();
        }
 
@@ -2724,7 +2724,7 @@ PHP_METHOD(SplFileObject, seek)
        CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern);
 
        if (line_pos < 0) {
-               zend_throw_exception_ex(spl_ce_LogicException, 0, "Can't seek file %s to negative line " ZEND_LONG_FMT, intern->file_name, line_pos);
+               zend_argument_value_error(1, "must be greater than or equal to 0");
                RETURN_THROWS();
        }
 
index df20a2b4bff04c0084a73a871b44b9353169e148..915e55f17cc6c8cd0453f32ac782d36041dc215c 100644 (file)
@@ -529,7 +529,7 @@ PHP_METHOD(SplFixedArray, __construct)
        }
 
        if (size < 0) {
-               zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0, "array size cannot be less than zero");
+               zend_argument_value_error(1, "must be greater than or equal to 0");
                RETURN_THROWS();
        }
 
@@ -704,7 +704,7 @@ PHP_METHOD(SplFixedArray, setSize)
        }
 
        if (size < 0) {
-               zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0, "array size cannot be less than zero");
+               zend_argument_value_error(1, "must be greater than or equal to 0");
                RETURN_THROWS();
        }
 
index 8dfcd84f4422c32c797b8fb33d610ed55387bbd4..731f7f7b6e866ddc35e83a5ee2f5c3d15bd93acb 100644 (file)
@@ -825,7 +825,7 @@ PHP_METHOD(RecursiveIteratorIterator, setMaxDepth)
                RETURN_THROWS();
        }
        if (max_depth < -1) {
-               zend_throw_exception(spl_ce_OutOfRangeException, "Parameter max_depth must be >= -1", 0);
+               zend_argument_value_error(1, "must be greater than or equal to -1");
                RETURN_THROWS();
        } else if (max_depth > INT_MAX) {
                max_depth = INT_MAX;
@@ -1037,7 +1037,7 @@ PHP_METHOD(RecursiveTreeIterator, setPrefixPart)
        }
 
        if (0 > part || part > 5) {
-               zend_throw_exception_ex(spl_ce_OutOfRangeException, 0, "Use RecursiveTreeIterator::PREFIX_* constant");
+               zend_argument_value_error(1, "must be a RecursiveTreeIterator::PREFIX_* constant");
                RETURN_THROWS();
        }
 
@@ -1246,6 +1246,7 @@ static zend_function *spl_dual_it_get_method(zend_object **object, zend_string *
 
 #define SPL_CHECK_CTOR(intern, classname) \
        if (intern->dit_type == DIT_Unknown) { \
+               /* TODO Normal Error? */ \
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Classes derived from %s must call %s::__construct()", \
                                ZSTR_VAL((spl_ce_##classname)->name), ZSTR_VAL((spl_ce_##classname)->name)); \
                RETURN_THROWS(); \
@@ -1290,11 +1291,11 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
                                return NULL;
                        }
                        if (intern->u.limit.offset < 0) {
-                               zend_throw_exception(spl_ce_OutOfRangeException, "Parameter offset must be >= 0", 0);
+                               zend_argument_value_error(2, "must be greater than or equal to 0");
                                return NULL;
                        }
-                       if (intern->u.limit.count < 0 && intern->u.limit.count != -1) {
-                               zend_throw_exception(spl_ce_OutOfRangeException, "Parameter count must either be -1 or a value greater than or equal 0", 0);
+                       if (intern->u.limit.count < -1) {
+                               zend_argument_value_error(3, "must be greater than or equal to -1");
                                return NULL;
                        }
                        break;
@@ -1306,7 +1307,9 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
                                return NULL;
                        }
                        if (spl_cit_check_flags(flags) != SUCCESS) {
-                               zend_throw_exception(spl_ce_InvalidArgumentException, "Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER", 0);
+                               zend_argument_value_error(2, "must contain only one of CachingIterator::CALL_TOSTRING, "
+                                       "CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, "
+                                       "or CachingIterator::TOSTRING_USE_INNER");
                                return NULL;
                        }
                        intern->u.caching.flags |= flags & CIT_PUBLIC;
@@ -1374,7 +1377,8 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
                                return NULL;
                        }
                        if (mode < 0 || mode >= REGIT_MODE_MAX) {
-                               zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0, "Illegal mode " ZEND_LONG_FMT, mode);
+                               zend_argument_value_error(3, "must be RegexIterator::MATCH, RegexIterator::GET_MATCH, "
+                                       "RegexIterator::ALL_MATCHES, RegexIterator::SPLIT, or RegexIterator::REPLACE");
                                return NULL;
                        }
 
@@ -1921,7 +1925,8 @@ PHP_METHOD(RegexIterator, setMode)
        }
 
        if (mode < 0 || mode >= REGIT_MODE_MAX) {
-               zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0, "Illegal mode " ZEND_LONG_FMT, mode);
+               zend_argument_value_error(1, "must be RegexIterator::MATCH, RegexIterator::GET_MATCH, "
+                       "RegexIterator::ALL_MATCHES, RegexIterator::SPLIT, or RegexIterator::REPLACE");
                RETURN_THROWS();
        }
 
@@ -2576,7 +2581,9 @@ PHP_METHOD(CachingIterator, setFlags)
        SPL_FETCH_AND_CHECK_DUAL_IT(intern, ZEND_THIS);
 
        if (spl_cit_check_flags(flags) != SUCCESS) {
-               zend_throw_exception(spl_ce_InvalidArgumentException , "Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER", 0);
+               zend_argument_value_error(1, "must contain only one of CachingIterator::CALL_TOSTRING, "
+                       "CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, "
+                       "or CachingIterator::TOSTRING_USE_INNER");
                RETURN_THROWS();
        }
        if ((intern->u.caching.flags & CIT_CALL_TOSTRING) != 0 && (flags & CIT_CALL_TOSTRING) == 0) {
index cf96425892603ccb29d8ca741b8b6137a8a5a81e..a2ae3f065c13e0180f9015ce1deca30acf2f85a7 100644 (file)
@@ -5,11 +5,11 @@ Havard Eide <nucleuz@gmail.com>
 #PHPTestFest2009 Norway 2009-06-09 \o/
 --FILE--
 <?php
-$it = new DirectoryIterator("");
+try {
+    $it = new DirectoryIterator("");
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 ?>
---EXPECTF--
-Fatal error: Uncaught RuntimeException: Directory name must not be empty. in %s:%d
-Stack trace:
-#0 %s(%d): DirectoryIterator->__construct('')
-#1 {main}
-  thrown in %s on line %d
+--EXPECT--
+DirectoryIterator::__construct(): Argument #1 ($path) cannot be empty
index acebb66f41569bee67726a41da535c7906d32772..30ad7729585551bec0493b6794a707c4fa7ecf4d 100644 (file)
@@ -5,9 +5,9 @@ SplFileObject::seek function - test parameters
 $obj = new SplFileObject(__FILE__);
 try {
     $obj->seek(-1);
-} catch (LogicException $e) {
+} catch (\ValueError $e) {
     echo($e->getMessage());
 }
 ?>
---EXPECTF--
-Can't seek file %s to negative line -1
+--EXPECT--
+SplFileObject::seek(): Argument #1 ($line_pos) must be greater than or equal to 0
index aba523dc62955cee7e8b816ca2d1114b856e0347..2f3348a2c49316c0f3dc7d201cbfff069b3493d4 100644 (file)
@@ -6,22 +6,15 @@ SPL: LimitIterator zero is valid offset
 $array = array('a', 'b', 'c');
 $arrayIterator = new ArrayIterator($array);
 
-try {
-  $limitIterator = new LimitIterator($arrayIterator, 0);
-  foreach ($limitIterator as $item) {
+$limitIterator = new LimitIterator($arrayIterator, 0);
+foreach ($limitIterator as $item) {
     echo $item . "\n";
-  }
-} catch (OutOfRangeException $e){
-  print $e->getMessage() . "\n";
 }
 
 try {
-  $limitIterator = new LimitIterator($arrayIterator, -1);
-  foreach ($limitIterator as $item) {
-    echo $item . "\n";
-  }
-} catch (OutOfRangeException $e){
-  print $e->getMessage() . "\n";
+    $limitIterator = new LimitIterator($arrayIterator, -1);
+} catch (\ValueError $e){
+    print $e->getMessage() . "\n";
 }
 
 ?>
@@ -29,4 +22,4 @@ try {
 a
 b
 c
-Parameter offset must be >= 0
+LimitIterator::__construct(): Argument #2 ($offset) must be greater than or equal to 0
index 6bfdfdcf5099451be2fa020dd99e0374c8ff3b1a..5a4229616a322d32c195518db9d11ac5ec3341fb 100644 (file)
@@ -8,10 +8,10 @@ $s = new SplFileObject( __FILE__ );
 try {
     $s->setMaxLineLen(-1);
 }
-catch (DomainException $e) {
-    echo 'DomainException thrown';
+catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
 }
 
 ?>
 --EXPECT--
-DomainException thrown
+SplFileObject::setMaxLineLen(): Argument #1 ($max_len) must be greater than or equal to 0
index 6dc26da396304ce77a01709f83cfce77adac7206..376985fd5d28f60a8e2f9a387e5b9a60019d869c 100644 (file)
@@ -12,16 +12,16 @@ var_dump($a->count());
 /* negative init value */
 try {
     $b = new SplFixedArray(-10);
-} catch (Exception $e) {
-    var_dump($e->getMessage());
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
 }
 
 /* resize and negative value */
 $b = new SplFixedArray();
 try {
     $b->setSize(-5);
-} catch (Exception $e) {
-    var_dump($e->getMessage());
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
 }
 
 /* calling __construct() twice */
@@ -63,8 +63,8 @@ var_dump(empty($a["3"]));
 --EXPECTF--
 int(0)
 int(0)
-string(35) "array size cannot be less than zero"
-string(35) "array size cannot be less than zero"
+SplFixedArray::__construct(): Argument #1 ($size) must be greater than or equal to 0
+SplFixedArray::setSize(): Argument #1 ($size) must be greater than or equal to 0
 NULL
 int(0)
 int(0)
index 5d681ccac05ef57dc622c6bb7d6ebf3b78181ae1..0b8253d25b382df998ca2db9d0e9976fd31b363a 100644 (file)
@@ -39,14 +39,11 @@ foreach($it as $v) echo $it->getDepth() . ": $v\n";
 echo "===-1===\n";
 $it->setMaxDepth(-1);
 var_dump($it->getMaxDepth());
-try
-{
-    $it->setMaxDepth(4);
+$it->setMaxDepth(4);
+try {
     $it->setMaxDepth(-2);
-}
-catch(Exception $e)
-{
-    var_dump($e->getMessage());
+} catch(\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
 }
 var_dump($it->getMaxDepth());
 ?>
@@ -105,5 +102,5 @@ int(0)
 0: 4
 ===-1===
 bool(false)
-string(33) "Parameter max_depth must be >= -1"
+RecursiveIteratorIterator::setMaxDepth(): Argument #1 ($max_depth) must be greater than or equal to -1
 int(4)
index 1792b1cb66faa878e870370c6699172232024001..baa15f36847d3ff9baffd86083f521004b19892f 100644 (file)
@@ -7,26 +7,20 @@ function test($ar, $flags)
 {
     echo "===$flags===\n";
     $it = new CachingIterator($ar, 0);
-    try
-    {
+    try {
         $it->setFlags($flags);
-    }
-    catch (Exception $e)
-    {
+    } catch (\ValueError $e) {
         echo 'Exception: ' . $e->getMessage() . "\n";
         var_dump($it->getFlags());
         return;
     }
     var_dump($it->getFlags());
-    try
-    {
+    try {
         foreach($it as $v)
         {
             var_dump((string)$it);
         }
-    }
-    catch (Exception $e)
-    {
+    } catch (Exception $e) {
         echo 'Exception: ' . $e->getMessage() . "\n";
     }
 }
@@ -110,19 +104,19 @@ string(3) "0:1"
 string(3) "1:2"
 string(3) "2:3"
 ===3===
-Exception: Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER
+Exception: CachingIterator::setFlags(): Argument #1 ($flags) must contain only one of CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, or CachingIterator::TOSTRING_USE_INNER
 int(0)
 ===5===
-Exception: Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER
+Exception: CachingIterator::setFlags(): Argument #1 ($flags) must contain only one of CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, or CachingIterator::TOSTRING_USE_INNER
 int(0)
 ===9===
-Exception: Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER
+Exception: CachingIterator::setFlags(): Argument #1 ($flags) must contain only one of CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, or CachingIterator::TOSTRING_USE_INNER
 int(0)
 ===6===
-Exception: Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER
+Exception: CachingIterator::setFlags(): Argument #1 ($flags) must contain only one of CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, or CachingIterator::TOSTRING_USE_INNER
 int(0)
 ===10===
-Exception: Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER
+Exception: CachingIterator::setFlags(): Argument #1 ($flags) must contain only one of CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, or CachingIterator::TOSTRING_USE_INNER
 int(0)
 ===X===
 Exception: Unsetting flag CALL_TO_STRING is not possible
index fbdc3a5cb1790f12bfc69dfa140d9cde98126117..2dd531882463ec6cea355f96c5bd7780526860d9 100644 (file)
@@ -20,14 +20,13 @@ foreach($it as $k => $v) {
 }
 try {
     $it->setPrefixPart(-1, "");
-    $it->setPrefixPart(6, "");
-} catch (OutOfRangeException $e) {
-    echo "OutOfRangeException thrown\n";
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
 }
 try {
     $it->setPrefixPart(6, "");
-} catch (OutOfRangeException $e) {
-    echo "OutOfRangeException thrown\n";
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
 }
 ?>
 --EXPECT--
@@ -35,5 +34,5 @@ try {
 [0] => 0145b
 [c] => 045Array
 [0] => 0245d
-OutOfRangeException thrown
-OutOfRangeException thrown
+RecursiveTreeIterator::setPrefixPart(): Argument #1 ($part) must be a RecursiveTreeIterator::PREFIX_* constant
+RecursiveTreeIterator::setPrefixPart(): Argument #1 ($part) must be a RecursiveTreeIterator::PREFIX_* constant
index 3b0eaf1d66c1ee77e51c2b7a6f1ffb92df7fd144..10df255f4a0126fec9582cb8c8b6ef876c1ecccd 100644 (file)
@@ -12,13 +12,13 @@ var_dump($regexIterator->getMode());
 
 try {
     $regexIterator->setMode(7);
-} catch (InvalidArgumentException $e) {
-    var_dump($e->getMessage());
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
     var_dump($e->getCode());
 }
 
 ?>
 --EXPECT--
 int(0)
-string(14) "Illegal mode 7"
+RegexIterator::setMode(): Argument #1 ($mode) must be RegexIterator::MATCH, RegexIterator::GET_MATCH, RegexIterator::ALL_MATCHES, RegexIterator::SPLIT, or RegexIterator::REPLACE
 int(0)
index 29bae9469d6f340b9ff34ef88ca811f9b389c86c..0d107d206f4af0702f058bf17e6ee3df552ddaf3 100644 (file)
@@ -8,16 +8,18 @@ TestFest London May 2009
   //line 681 ...
   $array = array(array(7,8,9),1,2,3,array(4,5,6));
 $arrayIterator = new ArrayIterator($array);
+new CachingIterator($arrayIterator, 0); /* TODO Should this throw? */
+new CachingIterator($arrayIterator, CachingIterator::CALL_TOSTRING);
+new CachingIterator($arrayIterator, CachingIterator::TOSTRING_USE_KEY);
+new CachingIterator($arrayIterator, CachingIterator::TOSTRING_USE_CURRENT);
+new CachingIterator($arrayIterator, CachingIterator::TOSTRING_USE_INNER);
 try {
-$test = new CachingIterator($arrayIterator, 0);
-$test = new CachingIterator($arrayIterator, 1);
-$test = new CachingIterator($arrayIterator, 2);
-$test = new CachingIterator($arrayIterator, 3); // this throws an exception
-} catch (InvalidArgumentException $e){
+    $test = new CachingIterator($arrayIterator, 3); // this throws an exception
+} catch (\ValueError $e){
   print  $e->getMessage() . "\n";
 }
 
 
 ?>
 --EXPECT--
-Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER
+CachingIterator::__construct(): Argument #2 ($flags) must contain only one of CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, or CachingIterator::TOSTRING_USE_INNER
index 83b99b5c85894ca761dec21021394b982b312663..91604abb3da44d9751d950cf6f09794595bd80c9 100644 (file)
@@ -10,26 +10,19 @@ $arrayIterator = new ArrayIterator($array);
 
 try {
   $limitIterator = new LimitIterator($arrayIterator, -1);
-} catch (OutOfRangeException $e){
+} catch (\ValueError $e){
   print $e->getMessage(). "\n";
 }
 
-
 try {
   $limitIterator = new LimitIterator($arrayIterator, 0, -2);
-} catch (OutOfRangeException $e){
-  print $e->getMessage() . "\n";
-}
-
-try {
-  $limitIterator = new LimitIterator($arrayIterator, 0, -1);
-} catch (OutOfRangeException $e){
+} catch (\ValueError $e){
   print $e->getMessage() . "\n";
 }
 
-
+$limitIterator = new LimitIterator($arrayIterator, 0, -1);
 
 ?>
 --EXPECT--
-Parameter offset must be >= 0
-Parameter count must either be -1 or a value greater than or equal 0
+LimitIterator::__construct(): Argument #2 ($offset) must be greater than or equal to 0
+LimitIterator::__construct(): Argument #3 ($count) must be greater than or equal to -1