2016-10-16 2 views
0

これは、すでに問題を解決しているので、これは単なるドキュメントですが、デバッグするには微妙で難解で、公的な領域では便利だと思っていました。オブジェクトメソッド内で例外がキャッチされていない

問題は、単に動作していないオブジェクトメソッドでtry/catchブロックがあることでした。

TestClass.php:

<?php 
//TestClass.php 
namespace MyTest; 

class TestClass { 
    public function __construct() { 
     \e("Initializing object"); 
     try { 
      \e("Trying object exception"); 
      \throwTestException("Failing gracefully in object"); 
      \e("After exception"); 
     } catch (Exception $e) { 
      \e($e->getMessage()); 
     } 
     \e("After object init exception"); 
    } 
} 
?> 

Main.php:ロードMain.php上

<?php 
//Main.php 

function e($str) { echo "\n$str"; } 
function throwTestException($msg) { 
    throw new RuntimeException($msg); 
} 
require "TestClass.php"; 

e("Beginning"); 
try { 
    e("First try"); 
    throwTestException("Failing gracefully first"); 
    e("After exception"); 
} catch (Exception $e) { 
    e($e->getMessage()); 
} 
e("Ending"); 

e(''); 

e('Beginning object test'); 
new \MyTest\TestClass(); 
e('Ending object test'); 
?> 

予想結果はこのだっ減少例は、次のようになり2つのファイルにあります。

:私は実際に得たもの

Beginning 
First try 
Failing gracefully first 
Ending 

Beginning object test 
Initializing object 
Trying object exception 
Failing gracefully in object 
After object init exception 
Ending object test 

はこのようなものでした

Beginning 
First try 
Failing gracefully first 
Ending 

Beginning object test 
Initializing object 
Trying object exception 

Fatal Error: Uncaught Exception: Failing gracefully in object...... 

ご覧のとおり、例外は検出されませんでした。私はあらゆる種類のものを試してみて、それがなぜ捕まえられていないのか分かりませんでした。そして、....(下記の回答を参照)

答えて

0

私はそれが名前空間の問題であることに気付きました。私は名前空間MyTestTestClassを宣言し、グローバル名前空間でthrowTestExceptionていた、クラスメソッド内Exceptionに私の参照が暗黙のうち\MyTest\Exceptionに解決するため、実際の例外がスローされるマッチングされなかったため、\RuntimeException。私は実際に名前空間内から例外をインスタンス化しようとしていなかったので、何が起こっていたのかを明らかにするために "Unknown Class"エラーは現れませんでした。

ソリューションは、その後、適切に私がキャッチしようとしていた例外クラスを解決するために、単純だった:

catch(\Exception $e) { .... } 

公平を期すために、私は私の非常に減少例を建てて、これが明らかになりました。クラスのスーパークラス(SQLite3クラス)によってキャッチが予想されていた例外が生成されていたため、当初は明らかではありませんでした。したがって、私は例外を生成するときに名前空間について心配する必要はなく、最も一般的な例外の型を使用することをキャッチするときに考えていたのは、Exceptionです。そして、私はその例外をインスタンス化していないので、ブロックされているcatchブロック内のそれと一致するだけであるため、未解決であるという通知はありませんでした。

関連する問題