2012-01-27 137 views
53

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

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“throw $ e-> getMessage();”应该是“扔$ e”; – 2016-07-04 18:40:21

回答

78
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-01-27 23:15:40

0
throw $e->getMessage(); 

你试着投string

一点题外话:异常通常是在验证后定义和应用程序的特殊状态不是错误消息。它不例外,当用户给你无效的数据时

+0

什么是更好的方式来处理验证? IF语句是否更适合处理无效的用户数据? – kaspnord 2012-01-27 23:08:26

+0

总之:是的。长期以来:像发生在您的应用程序中的任何其他情况一样,处理无效参数的出现,并显示其他有用(错误)页面。 'validateField($ validate){return empty($ validate);}'和某处例如'if validateField($ x){echo“Field is empty”;} else {doSomethingUseful();}' – KingCrunch 2012-01-28 00:15:21

+0

我看,谢谢为解释。 – kaspnord 2012-01-28 16:46:57

12

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

它不会告诉你只能在catch块中抛出对象,它告诉你只能抛出对象,并且错误的位置在catch块中 - 这是有区别的。

在catch块中,你试图抛出你刚抓到的东西 - 在这种情况下无论如何没有什么意义 - 而你试图抛出的东西是一个字符串。

你现在所做的一个现实世界的类比是抓球,然后试图把制造商的标志扔在其他地方。你只能抛出一个完整的对象,而不是该对象的一个​​属性。

+0

感谢您的澄清。 – kaspnord 2012-01-27 23:17:35

48

重新抛出做

throw $e; 

没了消息。

+0

谢谢,这个解决方案最适合我的需求。 – kaspnord 2012-01-27 23:17:18

+0

这就是我的想法,很乐意提供帮助。 – 2012-01-29 07:29:23

+4

虽然会保留堆栈信息,还是会覆盖它? – DanMan 2013-12-06 15:48:25