2016-11-23 11 views
4

私は、カスタムクラスを持っている:だから他のクラスから例外をキャッチする方法は?

class ActivationService extends SmsException { 

    public function __construct() 
    { 
      $this->sms = new SmsSender(); 
    } 

    public function method(){ 
     throw new SmsException(); // My custom exception 
    } 


    public function send(){ 
     $this->sms->sendSms($this->phone); // Here's where the error appeared 
    } 
} 

、私は$this->sms->sendSmsを呼び出すときに、私はクラスsmsからエラーが出ます。

私は、などのカスタム例外をキャッチしています:

try {  
    $activationService = new ActivationService(); 
    $activationService->send($request->phone);  
} 
catch (SmsException $e) {  
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

しかし、私はこの方法では、ライブラリ(class SmsSender)内のエラーを取得するとき:send()私はそれをキャッチすることはできませんし、私はエラーを取得します。

どうすれば修正できますか?

+0

おそらく、SmsExceptionをスローしていない可能性があります。 '\ Exception'のために別のキャッチブロックを追加し、それが何かをキャッチするかどうかを確認してください。 –

+0

はい、 '\ Exception'は動作しますが、なぜ私の例外が動作しないのですか? クラスSmsException例外を拡張します { // TODO } ' – Goga

+0

' \ SmsException'が必要ですか?私は名前空間がこれをぶつけることができることを知っています。 – nerdlyist

答えて

1

おそらく名前空間のことです。

<?php App\Libs; 

class MyLib { 

    public function foo() { 
     try { 

      $activationService = new ActivationService(); 
      $activationService->send($request->phone); 

     } catch (SmsException $e) { 

      echo 'Caught exception: ', $e->getMessage(), "\n"; 
     } 
    } 
} 
:例えば、全く

<?php namespace App\Exceptions; 

class SmsException extends \Exception { 
    // 
} 

と別の名前空間内で定義された例外をキャッチしようとしているコード、またはnone:SmsExceptionもし

は、たとえば、名前空間内で定義されています

App\Libs\SmsExceptionをキャッチしようとしています。これは定義されていないため、catchは失敗します。

catch (SmsException $e)catch (\App\Exceptions\SmsException $e)(明らかに正しい名前空間を使用してください)に置き換えるか、useステートメントをファイルの先頭に置きます。

<?php App\Libs; 

use App\Exceptions\SmsException; 

class MyLib { 

    // Code here... 
関連する問題