在 PHP Try Catch 块中抛出异常

Posted

技术标签:

【中文标题】在 PHP Try Catch 块中抛出异常【英文标题】:Throwing exceptions in a PHP Try Catch block 【发布时间】:2012-02-20 21:46:30 【问题描述】:

我在 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 块内抛出对象。

提前致谢!

【问题讨论】:

tl;dr "抛出 $e->getMessage();"应该是“throw $e;” 似乎产生了相同的代码:Parse error: syntax error, unexpected 'throw' (T_THROW)。我想不再支持了。 【参考方案1】:
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;
    */
  

【讨论】:

是的,您在 Catch 块中的两个建议都将解决我的问题。谢谢!【参考方案2】:

重新抛出做

 throw $e;

不是消息。

【讨论】:

谢谢,这个解决方案最适合我的需要。 我就是这么想的,很乐意提供帮助。 这会保留堆栈信息,还是会覆盖它? 保留,覆盖抛出一个新的电子【参考方案3】:

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

不是告诉你对象只能在catch块中抛出,而是告诉你只有对象可以被抛出,错误的位置在catch块中——有一个区别。

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

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

【讨论】:

感谢您的澄清。 很好的比喻(y)。【参考方案4】:

你试图抛出一个string

throw $e->getMessage();

您只能抛出实现\Throwable 的对象,例如\Exception.

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

【讨论】:

处理验证的更好方法是什么? IF 语句是否更适合处理无效的用户数据? 简而言之:是的。长篇大论:将无效参数的出现视为您的应用程序中可能发生的任何其他情况,并显示其他有用的(错误)页面。 function validateField($validate) return empty($validate); 和某处例如 if validateField($x) echo "Field is empty";elsedoSomethingUseful(); @lazycommit "invalid data" 有点笼统。如果您的意思是“用户给出的无效值”,那么从应用程序的角度来看,它们并不是无效的,因为应用程序必须期望这一点,因此必须适当地对待它们(--> 验证)。如果您稍后在处理过程中传递无效数据(来自后端,或者因为您没有正确验证),那么是:异常。总结一下:不要将Exceptions 用于控制流(这里:验证):) 你只能throw对象,所以throw $e;throw new \Exception( $e->getMessage() );【参考方案5】:

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

throw $e

【讨论】:

以上是关于在 PHP Try Catch 块中抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

在 try 块中抛出异常后,catch 块不会立即执行

php的异常处理,一个try代码块中抛出了多个异常,怎么全都捕获,并输出来?下面的代码为只输出一个异常?

JAVA语言如何进行异常处理,关键字throws,throw,try,catch,finally分别代表啥意义在try块中抛出异常吗

在 finally 块中抛出异常

在线程中处理在 catch 块中抛出的异常的最佳实践。 (。网)

finally中流关闭失败需要抛出异常吗