2011-05-18 62 views
0

我有这个PHP代码。每当y变为零时,它将显示警告而不是捕捉异常。我的代码有什么问题吗?除以零警告没有被捕获到一个PHP try/catch块

try 
{ 
    return($x % $y); 
    throw new Exception("Divide error.."); 
} 
catch(Exception $e){ 
    echo "Exception:".$e->getMessage(); 
} 

我得到了这样的警告:

Warning: Division by zero in file.php 

catch块不会运行。我究竟做错了什么?

+0

为什么不告诉我们你得到了什么样的警告? – ThiefMaster 2011-05-18 06:06:28

+0

返回后没有任何代码运行 – Ibu 2011-05-18 06:06:29

+0

我已经修复了您的缩进问题,下次您可能需要检查问题区域下方的预览框:您可以查看代码的出现方式,并将其修复一些,以便于阅读。记住,你问的问题越容易阅读,你可能得到的答案越多吗? – Nanne 2011-05-18 06:06:58

回答

7

警告并非例外。异常处理技术无法捕捉到警告。自从你总是return之前,你自己的例外永远不会抛出。

可以使用@运营商像@($x % $y)抑制警告,但你真正应该做的是确保$y不会变成0

即:

if (!$y) { 
    return 0; // or null, or do something else 
} else { 
    return $x % $y; 
} 
+0

我已经删除了返回声明。现在我能够捕捉到异常,但它仍然显示我警告.. – insomiac 2011-05-18 06:11:24

+0

@Aby如果您删除'return'语句,您将**总是**抛出并捕获异常。这里的例外是完全没用的。关于警告,请再次阅读我的答案。 – deceze 2011-05-18 06:12:21

3

是的,您正在执行throw之前的return。因此throw永远不会执行,也不会引发异常,也不会捕获异常。

+0

好的。我现在已经删除了返回语句。但它仍然显示我警告.. – insomiac 2011-05-18 06:12:25

-1

这是应该怎么做

$value; 

try 
{ 
    $value = $x%$y; 
} 
catch(Exception $e){ 
    throw new Exception("Divide error.."); 
    echo "Exception:".$e->getMessage(); 
} 

return $value 

但是,如果您想隐藏错误并单独处理它,您将收到警告可以使用@标志

$value = @$x%$y; 

现在可以测试值,看看它是否具有价值已经