2

私は単純な MVC フレームワークに取り組んでおり、クラスの自動読み込みを使用していますclass_eixists()。URI から解析されたコントローラー名が実際に存在するかどうかを確認し、適切に応答するために使用したいと考えています。私はから始めました

$controller = "\\namespace\\controller";
if(class_exists($controller))
   $this->controllerObject = new $controller();
else
    // react appropriately

クラスが存在しない場合、これにより、キャッチされていないロジック例外がスローされました。私の google-fu が私を失敗させなかった場合、これはオートローディングとclass_exists()関数を使用するときの通常のイベントです。私は大したことはないと考えて、それをtry catchでラップしましたが、まだキャッチされていない例外が発生しており、何が間違っているのかわかりません。

try {
     if (class_exists($controller))  {
        $this->controllerObject = new $controller(array_slice($parsedURI, 1));
        echo "controller is $controller<br />";
     }   
  } catch (LogicException $e) {
     $e->getMessage();
  } catch (Exception $e) {
     $e->getMessage();
  }

エラー出力は以下です。57 行目は ( if (class_exists($controller))) のある行です。システム管理者は内部情報が公開されることに偏執的であるため、実際のパスを手動で変更しました。

Fatal error: Uncaught exception 'LogicException' with message 'Class 
Controller\Gibberish could not be loaded' in     some/path/private/webroot/assets/route.php:57 Stack trace: #0 [internal function]: 
spl_autoload('Controller\Gibb...') #1 
some/path/private/app/webroot/assets/route.php(57): class_exists('\Controller\Gib...') 
#2 some/path/private/app/webroot/index.php(32): Assets\Route-
>__construct('/add/webroot/...') #3 {main} thrown in 
some/path/private/app/webroot/assets/route.php on line 57
4

1 に答える 1

3

投稿する前に回答を検索するのに約2時間かかり、その後、回答を見つける前に半分未満しか検索しませんでした。例外をキャッチできなかった理由は、ロジックが名前空間内にあるクラスのメソッド内にあるためです。キャッチするには、グローバル名前空間を指定するため LogicExceptionにプレフィックスを付ける必要があります。\

try {
   if (class_exists($controller))  {
      $this->controllerObject = new $controller(array_slice($parsedURI, 1));
      echo "controller is $controller<br />";
   }   
} catch (\LogicException $e) {
   $e->getMessage();
} 

同じ問題を持つ他の2つの質問を見つけました:

致命的な例外をスローするPhpMailer

キャッチできないOAuthExceptionをスローするFacebookPHPSDK

于 2012-06-20T19:08:27.817 に答える