PHP:'or'指令失败的语句:如何抛出新的异常?

这里的每个人都应该知道“or”statemens,通常粘在die()命令上:

$foo = bar() or die('Error: bar function return false.');

大多数时候,我们看到这样的东西:

mysql_query('SELECT ...') or die('Error in during the query');

但是,我无法理解“or”语句究竟是如何工作的。

我想抛出一个新的异常而不是die(),但是:

try{
    $foo = bar() or throw new Exception('We have a problem here');

不起作用,两者都不起作用

$foo = bar() or function(){ throw new Exception('We have a problem here'); }

我发现的唯一方法是这个可怕的想法:

function ThrowMe($mess, $code){
    throw new Exception($mess, $code);
}
try{
    $foo = bar() or ThrowMe('We have a problem in here', 666);
}catch(Exception $e){
    echo $e->getMessage();
}

但是有一种方法可以直接在“or”语句之后抛出新的异常?

或者这种结构是强制性的(我根本不喜欢ThrowMe函数):

try{
    $foo = bar();
    if(!$foo){
        throw new Exception('We have a problem in here');
    }
}catch(Exception $e){
    echo $e->getMessage();
}

编辑:我想要的是真正避免使用if()检查我所做的每个潜在的危险操作,例如:

#The echo $e->getMessage(); is just an example, in real life this have no sense!
try{
    $foo = bar();
    if(!$foo){
        throw new Exception('Problems with bar()');
    }
    $aa = bb($foo);
    if(!$aa){
        throw new Exception('Problems with bb()');
    }
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i relly prefer to use something like:

try{
    $foo = bar() or throw new Exception('Problems with bar()');
    $aa = bb($foo) or throw new Exception('Problems with bb()');
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#Actually, the only way i figured out is:

try{
    $foo = bar() or throw new ThrowMe('Problems with bar()', 1);
    $aa = bb($foo) or throw new ThrowMe('Problems with bb()', 2);
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i'll love to thro the exception directly instead of trick it with ThrowMe function.

答案 1

or只是一个逻辑运算符,它类似于 。||

常见的伎俩

mysql_query() or die();

也可以写

mysql_query() || die();

这里发生的事情是“逻辑或”运算符(无论您选择哪个运算符)正在尝试确定任何一个操作数的计算结果是否为 TRUE。这意味着操作数必须是可以转换为布尔值的表达式。

所以,原因

bar() or throw new Exception();

是非法的,因为

(boolean)throw new Exception();

也是非法的。实质上,引发异常的过程不会生成返回值供操作员检查。

但是调用函数确实会生成一个返回值供运算符检查(没有显式返回值会导致函数返回哪些强制转换为)这就是为什么当您在函数中包装异常抛出时它适合您的原因。NULLFALSE


答案 2

我只是为此定义了函数。toss

function toss(Exception $exception): void
{
    throw $exception;
}

由于文件/行/堆栈信息是在构造异常 () 而不是抛出 () 时捕获的,因此不会干扰调用堆栈。newthrow

所以你可以这样做。

something() or toss(new Exception('something failed'));

推荐