InvalidArgumentException

InvalidArgumentException

什么时候应该使用Exception,InvalidArgumentException或UnexpectedValueException?

我不知道它们之间的真正区别,因为我一直使用Exception。

最佳答案

不同的异常只会为您提供更多的粒度,并控制您如何捕获和处理异常。

考虑一个您正在做很多事情的类-例如获取输入数据,验证输入数据,然后将其保存在某处。您可能会决定,如果将错误或空的参数传递给get()方法,则可能会抛出InvalidArgumentException。验证时,如果有异常或不匹配的地方,则可以抛出UnexpectedValueException。如果发生完全出乎意料的事情,则可以抛出标准Exception

当您捕获时,这将很有用,因为您可以通过不同的方式处理不同类型的异常。例如:

class Example
{
    public function get($requiredVar = '')
    {
        if (empty($requiredVar)) {
            throw new InvalidArgumentException('Required var is empty.');
        }
        $this->validate($requiredVar);
        return $this->process($requiredVar);
    }

    public function validate($var = '')
    {
        if (strlen($var) !== 12) {
            throw new UnexpectedValueException('Var should be 12 characters long.');
        }
        return true;
    }

    public function process($var)
    {
        // ... do something. Assuming it fails, an Exception is thrown
        throw new Exception('Something unexpected happened');
    }
}

在上面的示例类中,调用它时,您可以catch多种类型的异常,如下所示:
try {
    $example = new Example;
    $example->get('hello world');
} catch (InvalidArgumentException $e) {
    var_dump('You forgot to pass a parameter! Exception: ' . $e->getMessage());
} catch (UnexpectedValueException $e) {
    var_dump('The value you passed didn\'t match the schema... Exception: ' . $e->getMessage());
} catch (Exception $e) {
    var_dump('Something went wrong... Message: ' . $e->getMessage());
}

在这种情况下,您将获得一个像这样的UnexpectedValueException:string(92) "The value you passed didn't match the schema... Exception: Var should be 12 characters long."

还应注意these exception classes all end up extending from Exception,因此,如果您没有为InvalidArgumentException或其他代码定义特殊处理程序,则无论如何它们都将被Exception捕获程序捕获。那么,为什么不使用它们呢?

关于php - Exception,InvalidArgumentException或UnexpectedValueException有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31255468/

10-10 15:21