在PHP7中引发异常以进行验证?

在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

我正在更新一个刚完成的框架。我从社区得到了一些反馈,并决定构建一个小型可移植的MVC框架来容纳我的包

我目前正在开发路由器,当我向框架提供它应该得到的URL时,它工作得非常好。我使用了
抛出新异常(“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脚本之外,没有任何与此相关的错误记录在我的日志文件中,也没有任何致命错误。我继续前进,并预先等待我的捕捉块的斜线,没有任何变化。我没有领会你的意思吗?我也试着在我所有的抛出语句中加上斜杠,但没有用。