在PHP7中引发异常以进行验证?
我正在更新一个刚完成的框架。我从社区得到了一些反馈,并决定构建一个小型可移植的MVC框架来容纳我的包 我目前正在开发路由器,当我向框架提供它应该得到的URL时,它工作得非常好。我使用了在PHP7中引发异常以进行验证?,php,validation,exception,exception-handling,php-7,Php,Validation,Exception,Exception Handling,Php 7,我正在更新一个刚完成的框架。我从社区得到了一些反馈,并决定构建一个小型可移植的MVC框架来容纳我的包 我目前正在开发路由器,当我向框架提供它应该得到的URL时,它工作得非常好。我使用了抛出新异常(“MyMessage”)使验证URL更面向对象,也更简单 然而,这是我第一次尝试这样做,我的catch块似乎没有捕捉到错误 具体来说,每当try块中抛出错误时,我希望它触发catch块中的某个代码。 这是完整的try/catch块 try { if (isset($url[0
抛出新异常(“MyMessage”)
使验证URL更面向对象,也更简单
然而,这是我第一次尝试这样做,我的catch块似乎没有捕捉到错误
具体来说,每当try
块中抛出错误时,我希望它触发catch
块中的某个代码。
这是完整的try/catch
块
try
{
if (isset($url[0]) && isset($url[1]) && isset($url[2]) && $url[0] . $url[1] . $url[2] != "")
{
//Figure out if we're handling a package, or working in the package manager.
if ($url[0] != "ignition" && $url[0] != "")
{
if (!file_exists("../packages/" . $url[0]))
{
throw new Exception($manager_error = "Package \"" . $url[0] . "\" not found.");
}
else
{
$this->package = $url[0];
$this->path = "../packages/$this->package/controllers/";
}
unset($url[0]);
}
elseif ($url[0] == "")
throw new Exception("No package name provided.");
//Check if controller exists.
if ($url[1] != "")
{
//Check if controller file exists.
if (file_exists($this->path . $url[1] . ".php"))
{
$this->controller = $url[1];
require_once($this->path . "$this->controller.php");
unset($url[1]);
//Check that controller exists in file.
if (class_exists($this->controller))
{
$this->controller = new $this->controller;
//Check that method exists in controller.
if ($url[2] != "")
{
if (method_exists($this->controller, $url[2]))
{
$this->method = $url[2];
unset($url[2]);
if (!empty($url))
$this->params = array_values($url);
}
else
throw new Exception("Method \"" . $url[2] . "\" not found in controller \"" . get_class($this->controller) . "\".");
}
else
throw new Exception("No method name provided.");
}
else
throw new Exception("Controller \"$this->controller\" not contained in it's file.");
} else {
throw new Exception("Controller file \"" . $url[1] . ".php\" not found.");
}
}
else
throw new Exception("No controller name provided.");
}
else
{
//Check if we have one or more arguments, but less than the three
//we need for a complete route.
if (!isset($url[0]))
$url[0] = "";
if (!isset($url[1]))
$url[1] = "";
if (!isset($url[2]))
$url[2] = "";
if ($url[0] . $url[1] . $url[2] != "") {
if ($url[0] == "")
throw new Exception("No package name provided.");
elseif ($url[1] == "")
throw new Exception("No controller name provided.");
elseif ($url[2] = "")
throw new Exception("No method name provided.");
}
}
}
catch (Exception $e)
{
unset($url);
$this->manager_error = $e->getMessage();
$this->package = "ignition";
$this->controller = "ignition";
$this->method = "notFound";
$this->path = "../package_manager/controllers/";
$this->params[] = $this->manager_error;
require_once($this->path . "$this->controller.php");
$this->controller = new $this->controller;
}
我曾经尝试过制作一个非常简单的版本,在这个版本中,我只是回显了一些文本,并在地址栏中放置了一些错误的URL,试图从catch块中获取一些内容,但我没有成功
我还想提到,这是在一个类的构造函数中,如果这有什么区别的话
我在这里做错了什么,如何更改此脚本以捕获异常?命名空间中异常的一个常见问题是您可能抛出了一个扩展子级。例如
namespace test;
class Class {
public function __construct(){
try {
throw new Exception('Msg');
} catch(Exception $err) {
}
}
}
因此,在本例中,我们抛出并捕获\test\Exception
。名称空间更改了我们抛出的异常类。哪里出了问题
try {
new \BadClass(); // throws BadException
} catch(Exception $err) {
}
这不会抛出\test\Exception
,但您的类型提示会这样。因此,这将产生致命错误,因为catch
与类型提示中的正确类不匹配。有一个简单的方法可以解决这个问题
catch(\Exception $err)
现在您的
catch
可以捕获所有异常,因为根据定义,它们都扩展了基类。\
告诉PHP使用根异常
类。命名空间中异常
的一个常见问题是可能抛出了一个扩展子类。例如
namespace test;
class Class {
public function __construct(){
try {
throw new Exception('Msg');
} catch(Exception $err) {
}
}
}
因此,在本例中,我们抛出并捕获\test\Exception
。名称空间更改了我们抛出的异常类。哪里出了问题
try {
new \BadClass(); // throws BadException
} catch(Exception $err) {
}
这不会抛出\test\Exception
,但您的类型提示会这样。因此,这将产生致命错误,因为catch
与类型提示中的正确类不匹配。有一个简单的方法可以解决这个问题
catch(\Exception $err)
现在您的
catch
可以捕获所有异常,因为根据定义,它们都扩展了基类。\
告诉PHP使用根异常
类。如果不看到抛出异常的代码,很难回答这个问题。如果您愿意,我可以发布整个脚本。只要一个条件抛出异常,它在哪里抛出就有关系吗?至少向我们展示完整的try/catch
代码(这是您需要我们帮助的)。为了涵盖所有的基础,这里涉及到名称空间吗?这都在\u构造中!?如果不看到抛出异常的代码,很难回答这个问题。如果您愿意,我可以发布整个脚本。只要一个条件抛出异常,它在哪里抛出就有关系吗?至少向我们展示完整的try/catch
代码(这是您需要我们帮助的)。为了涵盖所有的基础,这里涉及到名称空间吗?这都在\u构造中!?嗯,我不确定我在听。我还没有声明名称空间,也没有收到任何致命错误。当我尝试加载页面时,除了缺少生成控制器对象的catch脚本之外,没有任何与此相关的错误记录在我的日志文件中,也没有任何致命错误。我继续前进,并预先等待我的捕捉块的斜线,没有任何变化。我没有领会你的意思吗?我也试着在我所有的抛出语句中加上斜杠,但没有用。我不确定我在听。我还没有声明名称空间,也没有收到任何致命错误。当我尝试加载页面时,除了缺少生成控制器对象的catch脚本之外,没有任何与此相关的错误记录在我的日志文件中,也没有任何致命错误。我继续前进,并预先等待我的捕捉块的斜线,没有任何变化。我没有领会你的意思吗?我也试着在我所有的抛出语句中加上斜杠,但没有用。