为什么找不到子异常?

Why child exception is not found?

提问人:Yokke 提问时间:7/12/2023 最后编辑:rozsazoltanYokke 更新时间:7/17/2023 访问量:62

问:

我有一个子异常,它继承了他的父级,扩展到 Exception 类:

namespace Exceptions;
    
use Exception;
    
class InvalidFieldException extends Exception
{
}
    
class UsernameWrongFormatException extends InvalidFieldException
{
  const USERNAME_MESSAGE_ERROR_WRONG_FORMAT = "Oops ! Merci de suivre le format ci-dessous pour votre nom d'utilisateur !";
}
namespace Controller;
    
use Model\User;
use Model\UserModel;
use Enumeration\UserType;
// use Exceptions\EmptyFieldException;
use Exceptions\FileTypeException;
use Exceptions\InvalidFieldException;
use Exceptions\UsernameWrongFormatException;
// use Exceptions\InvalidFieldException;

使用异常的控制器:

readonly class UserController
{
  public function __construct(private User $user)
  {
  }

  public function handleUsernameField(string $username)
  {    
    $userRegex =  "/^[A-Z][A-Za-z\d]{2,10}$/";
    if (!empty($username)) {
      if (preg_match($userRegex, $username)) {
        return ["username" => $username];
      }
      header("HTTP/1.1 400");
         
      throw new UsernameWrongFormatException();
    }
    header("HTTP/1.1 400");
    //  throw new
    EmptyFieldException(
      EmptyFieldException::USERNAME_MESSAGE_ERROR_EMPTY
    );
  }
}

我正在使用 index.php 文件中的一个条件来检查引发了哪个异常,但我仍然不明白为什么没有任何工作:

switch ($action) {
  case "sign_up":
    try {
      $template = "sign_up.twig";
      $paramaters["message"] = $userController->signUpValidator(
        $_POST['username'],
        // $_FILES['profile_image'],
        // $_POST["mail"],
        // $_POST["password"]
      );
    } catch (InvalidFieldException $e) {
      if ($e instanceof UsernameWrongFormatException){
        $paramaters["username_wrong_format_error"] = UsernameWrongFormatException::USERNAME_MESSAGE_ERROR_WRONG_FORMAT;
      }
      elseif ($e instanceof FileTypeException) {
        $paramaters["file_type_error"] = FileTypeException::FILE_MESSAGE_ERROR_TYPE_FILE;
      }
    }
    break;

我错过了什么吗?我从例外开始。

对不起,我在这里添加了更多细节,就像我说的,如果我使用父异常,一切正常,但这不是我的目标,因为我有许多继承父异常的异常,允许我检查哪些异常被抛出,这要归功于 instanceof 属性。index.php

PHP 似乎根本无法识别子类,我不明白为什么,因为当我单击命名空间时,它会将我带到正确的命名空间,让我认为 vscode 的作曲家知道类在哪里

PHP 异常 继承

评论

0赞 ADyson 7/12/2023
你说的“似乎不被认可”到底是什么意思?运行代码时是否有错误?还是意想不到的行为?请尽量更准确地说明这个问题。
0赞 Yokke 7/12/2023
@ADyson 我有这个错误:致命错误:未捕获的错误:未找到类“Exceptions\UsernameWrongFormatException”,我想也许是因为我在一个文件中有太多类,所以也许我应该每个文件有一个类?我想看看 PSR 规则中是否有关于它的东西。
3赞 shingo 7/12/2023
use 语句不加载类文件。您必须使用 require/include 语句或使用自动加载函数来执行此操作。
0赞 ADyson 7/12/2023
I thought perhaps its because I have too many class in one file...不,没有限制。PHP不在乎你的文件有多大,我不知道你从哪里得到这个想法。即使 PSR 中有一些关于它的指导,PHP 也不会强制执行这些规则。PSR 只是一组建议,以帮助使您的代码更有条理和可读性,它不是 PHP 关心的规则。
0赞 ADyson 7/12/2023
因此,如果在你将该类移动到一个单独的文件后没有找到该类,那么,正如 Shingo 的评论所暗示的那样,这将是因为你没有将另一个文件包含在你的主脚本中,所以 PHP 在运行时看不到该代码。

答:

-1赞 Yokke 7/17/2023 #1

我没有找到比为每个异常创建一个文件并在它们自己的 catch 块中捕获它们更好的解决方案