我想知道throw
在PHP中是如何工作的。
例如,它的行为是die()
还是exit()
?我怎么知道内部做了什么?
我问这个是因为我看到Kohana使用他们的$this->redirect()
方法抛出来终止脚本执行而不是传统的退出。
答案 0 :(得分:3)
throw
与exit
或die
完全不同。抛出异常不会自动终止应用程序,应用程序可以捕获抛出异常。只有当不被捕获的异常时才会终止该应用程序。
try {
throw new Exception;
} catch (Exception $e) {
echo 'caught it';
}
echo 'not dead yet';
例外是一种机制,可以比简单return false
语句允许的更灵活,更严格的方式向更高级别的呼叫者发出错误信号。它们与简单的exit
或die
无法比较。
我不知道Kohana究竟做了什么,但是抛出异常而不是使用简单的exit
或die
是滥用异常。只应在异常错误情况下抛出异常。
答案 1 :(得分:2)
正如已经解释过的那样,你使用throw
来抛出可以捕获的异常"进一步向上"在你的申请中。
当您使用对象和面向对象的编程时,您开始将您制作的每个对象编码为可以提供给其他人的独立对象。这些公共方法是 API ,每个公共方法上方的phpdoc详细说明了在某些情况下类可能会抛出的例外。
因此,有人创建了一个独立的对象,可以为您执行某些操作,例如写入磁盘。您希望使用此对象,因此,当文档由于权限问题而无法写入磁盘时,您可以查看文档并看到它会引发PermissionsException
。
在您的代码中使用此人的对象,您现在知道应该捕捉该异常,记录并继续,但是您想要您的应用程序在这种情况下工作(例如,如果用户通过AJAX调用向用户显示一个很好的错误)。
因此,知道这一点,当您编写自己的对象时,针对不同情况制作描述性例外情况您将对象的某个人可以在其中使用和回复自己的应用程序。
您不想在生产应用程序中使用die
和exit
。当你执行var_dump()
并且之后想要暂停应用程序执行或者由于某种原因你想要完全停止脚本运行时,它们对于调试很有用。
至于为什么您的特定代码片段以这种方式执行,您应该询问开发人员是否有良好的推理记录。
答案 2 :(得分:0)
使用" throw"没有try / catch将使用"可捕获的致命错误"来终止脚本。据我所知,使用" throw"没有任何好处。这条路。如果你想终止一个脚本你应该使用exit(),所以你不需要压制错误信息。