在PHP Try Catch块中引发异常


76

我在Drupal 6 .module文件中有一个PHP函数。我试图在执行更复杂的任务(例如数据库查询)之前运行初始变量验证。在C#中,我曾经在Try块的开头实现IF语句,如果验证失败,该语句将引发新的异常。抛出的异常将在Catch块中捕获。以下是我的PHP代码:

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    throw $e->getMessage();
  }
}

但是,当我尝试运行代码时,它告诉我只能在Catch块内抛出对象。

提前致谢!


3
tl; dr“抛出$ e-> getMessage();” 应该是“ throw $ e;”
Christoff Erasmus

似乎会产生相同的代码:Parse error: syntax error, unexpected 'throw' (T_THROW)。我猜不再支持。
user2924019

Answers:


105
function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    /*
        Here you can either echo the exception message like: 
        echo $e->getMessage(); 

        Or you can throw the Exception Object $e like:
        throw $e;
    */
  }
}

1
是的,您在Catch块中的两个建议都可以解决我的问题。谢谢!
kaspnord 2012年


16

只需throw从catch块中删除-将其更改为echo或以其他方式处理错误。

这不是在告诉您只能将对象抛出在catch块中,而是在告诉您可以抛出对象,并且错误的位置在catch块中-有所不同。

在catch块中,您试图抛出刚刚捕获的东西-在这种情况下,这毫无意义-并且您试图抛出的东西是字符串。

在现实世界中,您正在做的比喻是接球,然后尝试将制造商的徽标丢到其他地方。您只能抛出整个对象,而不能抛出对象的属性。


感谢您的澄清。
kaspnord 2012年

打个比方(y)。
Tony Vlcek

7
throw $e->getMessage();

您尝试扔一个 string

附带说明:异常通常是定义应用程序的异常状态,而不是验证后的错误消息。当用户向您提供无效数据时,也不例外


什么是处理验证的更好方法?IF语句更适合处理无效的用户数据吗?
kaspnord 2012年

简而言之:是的。长期而言:将无效参数的出现像在您的应用中可能发生的任何其他情况一样对待,并显示另一个有用的(错误)页面。function validateField($validate) {return empty($validate);}以某处为例if validateField($x){ echo "Field is empty";}else{doSomethingUseful();}
KingCrunch 2012年

4
@lazycommit“无效数据”有点笼统。如果您指的是“用户提供的无效值”,那么从应用程序的角度来看它们并不是无效的,因为应用程序必须期望这一点,因此必须对它们进行适当的处​​理(->验证)。如果稍后在处理过程中(从后端或由于未正确验证)传递了无效数据,则是:异常。总结一下:不要将Exceptions用于控制流(此处:验证):)
KingCrunch 2013年

您只能throw反对,所以throw $e;throw new \Exception( $e->getMessage() );
塞缪尔·艾尔

0

Throw需要一个由实例化的对象\Exception。只是$e抓住了就可以发挥作用。

throw $e
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.