首页 > 解决方案 > 如何在 Symfony v2.8/PHP v5.6 中抛出 InvalidArgumentException 内置异常

问题描述

这个问题得到了回答,但它提出了一个关于如何捕获 InvalidArgumentException 的问题,我在更新部分添加了这个问题。

***原始问题***

我正在使用 Symfony v2.8 和 PHP v5.6,当 $id 参数没有整数值时,我想在函数中抛出 InvalidArgumentException 异常,包含以下代码:

function vote( $id ) {

  if( !is_integer( $id ) ) 

      throw new InvalidArgumentException( 'An invalid argument was specified ...' );

  else ...

      // Add a vote to the record specified by the $id parameter ...

  ⫶

}

在我的代码中,实际的消息会更有意义

与 PHP 手册中显示此throw-exception的示例不同,当我加载导致上述代码在我的服务器上执行的页面时,Symfony 会输出以下错误:

Attempted to load class "InvalidArgumentException" from namespace 
"AppBundle\Controller".
Did you forget a "use" statement for e.g. 
"Doctrine\DBAL\Exception\InvalidArgumentException", 
"Symfony\Component\Serializer\Exception\InvalidArgumentException", 
"Symfony\Component\Intl\Exception\InvalidArgumentException", 
"Symfony\Component\Form\Exception\InvalidArgumentException", 
"Symfony\Component\PropertyAccess\Exception\InvalidArgumentException", 
"Symfony\Component\Process\Exception\InvalidArgumentException", 
"Symfony\Component\Asset\Exception\InvalidArgumentException", 
"Symfony\Component\OptionsResolver\Exception\InvalidArgumentException", 
"Symfony\Component\Console\Exception\InvalidArgumentException", 
"Symfony\Component\Security\Core\Exception\InvalidArgumentException", 
"Symfony\Component\Validator\Exception\InvalidArgumentException", 
"Symfony\Component\DependencyInjection\Exception\InvalidArgumentException", 
"Psr\Log\InvalidArgumentException", 
"Doctrine\Instantiator\Exception\InvalidArgumentException" or 
"Doctrine\Common\Proxy\Exception\InvalidArgumentException"?
500 Internal Server Error - ClassNotFoundException

我可以将所有这些组件添加到我的班级的 USE 列表中,这可能会起作用,但这似乎有点过头了,因为大多数(如果不是全部)似乎不适用于我正在检查 $id 参数的上下文,但是在查看了每个建议的组件之后,我看不到任何似乎适用于为非整数类型的函数的 $id 参数创建通用函数参数陷阱的内容。我查看了 Symfony 站点的文档以使用此异常,并试图找到一个“适合”我预期用途的组件,但找不到任何适用的组件。

请在他们的 Symfony 代码中使用此异常的人告诉我建议的组件列表中的哪些组件或我应该添加到我的代码中的其他组件,以便它可以正确地抛出 InvalidArgumentException 异常?

*** 更新 ***

我目前正在捕获数据库尝试插入重复行错误,如下所示:

catch( \Exception $e ) {

    if( get_class( $e ) ===
        'Doctrine\DBAL\Exception\UniqueConstraintViolationException' ) {

        if( $command === 'vote' )

            return 'You may only vote once on an Artist\'s ' .
                   ( ( $media === 'Songs' ) ? 'song' : 'video' ) . '.';

        else

                return '';

        // End of if( $command === 'vote' ) ...

    }
    else

        throw $e; // Re-Throw all other exceptions.

    // End of if( get_class( $e ) !==
    //            'Doctrine\...\UniqueConstraintViolationException' ) ...
    //        else ...

} // End of try ... catch( \Exception $e ) ...

在 Unique Constraint Violation Exception 的情况下,我使用 'Doctrine\DBAL\Exception\UniqueConstraintViolationException' 类名字符串查找它,但在 USE 语句中,我使用了 Doctrine\DBAL\DBALException,但两者不同。

*** 更新 ***

我目前不想处理 InvalidArgumentException,但如果我这样做了,是否有它的类名?这个异常没有对应的USE语句,所以找了一个也没找到。

更广泛地说,您如何确定要捕获的每个异常使用哪些类名?Symfony 异常处理是否有这样的列表?

谢谢

标签: phpexceptionthrowsymfony-2.8invalid-argument

解决方案


推荐阅读