PHPAPI REST:捕获所有值对象异常并将它们呈现为数组

PHPAPI REST:捕获所有值对象异常并将它们呈现为数组,php,api,rest,domain-driven-design,value-objects,Php,Api,Rest,Domain Driven Design,Value Objects,我正在使用值对象开发一个PHP API REST。 我有一些值对象,如:ID、Date、Name等。当它们由于无效格式或其他原因在构造过程中失败时,它会抛出InvalidArgumentException 如何“收集”所有异常,以及脚本何时停止在json响应中以“错误”数组发送异常 问题是,我认为为每个值对象生成数百个try-catch不是最好的方法,而且我无法找到在try块中捕获多个异常的方法 可能引发InvalidArgumentException的值对象 $authorID = new I

我正在使用值对象开发一个PHP API REST。 我有一些值对象,如:ID、Date、Name等。当它们由于无效格式或其他原因在构造过程中失败时,它会抛出InvalidArgumentException

如何“收集”所有异常,以及脚本何时停止在json响应中以“错误”数组发送异常

问题是,我认为为每个值对象生成数百个try-catch不是最好的方法,而且我无法找到在try块中捕获多个异常的方法

可能引发InvalidArgumentException的值对象

$authorID = new ID('dd'); // Must be an integer greather than 0 or null
我还想在实体的构造函数中传递这个ValueObject

 new Insertable($authorID);
如果我有多个可能抛出异常的ValueObject,我如何捕获它们并将这些异常作为“错误”数组进行响应


谢谢

我们只需要使用一个try-catch块,因为它可以在一次执行中处理多个错误/异常。例如:

try {
    $x = 5;

    //Statement 1
    throw_if(x===5, new Exception('Some Message'));

    //Statement 2
    throw_if(x===2, new Exception('Some Message'));

    //go ahead with your logic
} catch(Exception $e) {
    $message = $e->getMessage();
    //send error response here
} 
$errors = [];
try {
    $x = 5;

    //Statement 1
    if($x===5) {
        $errors['stmt1'] = 'Some Message';
    }

    //Statement 2
    if($x===2) {
        $errors['stmt2'] = 'Some Message';
    }

    if(count($errors) > 0) {
        //return the $errors here as it contains all error(S)/exception(s)
    }

    //go ahead with your logic
} catch(Exception $e) {
    $message = $e->getMessage();
    //Any unknown error/exception will be catches here
} 
如果要收集所有错误/异常并在错误响应中返回它们,请执行此操作。例如:

try {
    $x = 5;

    //Statement 1
    throw_if(x===5, new Exception('Some Message'));

    //Statement 2
    throw_if(x===2, new Exception('Some Message'));

    //go ahead with your logic
} catch(Exception $e) {
    $message = $e->getMessage();
    //send error response here
} 
$errors = [];
try {
    $x = 5;

    //Statement 1
    if($x===5) {
        $errors['stmt1'] = 'Some Message';
    }

    //Statement 2
    if($x===2) {
        $errors['stmt2'] = 'Some Message';
    }

    if(count($errors) > 0) {
        //return the $errors here as it contains all error(S)/exception(s)
    }

    //go ahead with your logic
} catch(Exception $e) {
    $message = $e->getMessage();
    //Any unknown error/exception will be catches here
} 

这不是特别优雅,而是一个可能的解决方案。只需创建一个全局
$errors
数组并收集所有消息

$errors = [];

try {
    $authorID = new ID('dd');
} catch(Exception $e) {
    $errors[] = $e->getMessage();
}

// and collect some more

try {
    $authorID = new ID('ff');
} catch(Exception $e) {
    $errors[] = $e->getMessage();
}
最后将它们全部输出

echo json_encode(['errors' => $errors], JSON_PRETTY_PRINT);
会给你类似的东西

{
    "errors": [
        "Author ID needs to be numeric",
        "Author ID needs to be numeric"
    ]
}

对不起,我的头烧坏了,我忘了将这部分添加到示例中。我已经做了同样的解决方案,但我想改变它,因为它不是优雅的,它是一个技术测试。。。我很抱歉!为了使它真正优雅,您应该在第一个异常发生后尽快停止执行。如果第一个异常总是最相关的,那么为什么要捕获许多异常?您还应该将此问题发布在
代码复查堆栈交换
上,我认为它最适合那里,因为这个问题实际上不是编码“问题”。我正在学习值对象。所有人都说,如果该对象的值无效,它必须抛出异常。如果多个VO抛出异常,我如何捕获所有异常,以便在每次重试时不向用户仅显示一个异常?。我不明白。。。我将查看堆栈交换异常的用法是在致命情况下退出程序。因此,如果出现这样的情况,程序可能会显示它,并在释放所有资源后立即退出。当你处理很多异常时,你会得到一个(过于)复杂的流程。另外,当一个异常发生并且你“忽略它”时,你肯定会因为处理无效值而创建更多的以下异常。你为什么要收集它们?示例:数据库连接失败,当查询是必需的时,为什么要继续?任何后续查询都将失败并引发更多异常。只有第一个(无法连接)才是真正相关的。所以在第一次之后退出。