在 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" 有点笼统。如果您的意思是“用户给出的无效值”,那么从应用程序的角度来看,它们并不是无效的,因为应用程序必须期望这一点,因此必须适当地对待它们(--> 验证)。如果您稍后在处理过程中传递无效数据(来自后端,或者因为您没有正确验证),那么是:异常。总结一下:不要将Exception
s 用于控制流(这里:验证):)
你只能throw
对象,所以throw $e;
或throw new \Exception( $e->getMessage() );
。【参考方案5】:
Throw 需要一个由\Exception
实例化的对象。只需抓住$e
就可以发挥作用。
throw $e
【讨论】:
以上是关于在 PHP Try Catch 块中抛出异常的主要内容,如果未能解决你的问题,请参考以下文章
php的异常处理,一个try代码块中抛出了多个异常,怎么全都捕获,并输出来?下面的代码为只输出一个异常?
JAVA语言如何进行异常处理,关键字throws,throw,try,catch,finally分别代表啥意义在try块中抛出异常吗