2016-03-21 18 views
4

私はPHP libraryで作業しています。これはさまざまなPHPプロジェクトによってさまざまな環境で使用される可能性があり、できるだけ最小限に抑えようとしています。PHP例外の引数

いくつかの状況では、たとえば例外をスローする必要があります。

throw Exception('template has invalid tag'); 

そのようなエラーは、タグの名前のない非常に有用ではありません。

throw Exception('template has invalid tag: '.$tag); 

これはローカライズするのは難しいだろうとなると、射出あらゆる種類の問題を生じる可能性があります。

質問:PHPで余分な変数をExceptionで渡す最も良い方法は何ですか?

(注:私のライブラリは、SQLクエリの構築を行い、私は例外で問題を解決していない、タスクに集中することを好むだろう)

答えて

4

国際化は、ではありません。あなたのプロジェクトに1つ以上のExceptionクラスを作成してください(それはあまり一般的ではないので、\Exceptionはお勧めしません)。

エラーメッセージはそのままで、新しい例外のコンストラクタに値を引数として渡します。それらのためのゲッタを提供する。エラーメッセージは開発者向けです。ライブラリを使用するコードは、例外をキャッチし、例外に適したエラーメッセージを表示する必要があります。とにかく、あなたが提供する生のメッセージを表示すべきではありません。

たとえば、あなたはあなたのライブラリに宣言する:

class InvalidTagException extends \Exception 
{ 
    protected $tag; 

    public function __construct($message, $tag, $code = 0, Throwable $previous = NULL) 
    { 
     // Let the parent class initialize its members 
     parent::__construct($message, $code, $previous); 
     // Initialize own members 
     $this->tag = $tag; 
    } 

    public function getTag() 
    { 
     return $tag; 
    } 
} 

// Declare other Exception classes in a similar fashion, for each kind of exception you throw 
class InvalidValueException extends \Exception 
{ 
    // ... 
} 

あなたのライブラリーを使用するアプリケーション:

try { 
    // call your library code here 
} catch (InvalidTagException $e) { 
    // Handle in application specific way 

} catch (InvalidValueException $e) { 
    // A different type of exception requires a different type of handling 
} 
+0

ここで私はそれを実装した方法です:http://dsql.readthedocs.io/en/develop/advanced.html#exception-class – romaninsh

1

一つの可能​​な解決策は、このようsprintfを使用することです:

throw new Exception(sprintf(_('template has invalid tag %s'), $tag));

_()は、ローカライゼーション機能です。

しかし、これはまだ最適な解決策ではありません。なぜなら、htmlインジェクションにはまだオープンしており、渡す5つの変数があると非常に乱雑になるからです。私が見た限り、Wordpressはそのようなローカリゼーションアプローチを使用しています。

3

独自の例外クラスを定義し、コンストラクタに変数を追加することができます。例えば

:その場合は

class AnswerException extends \Exception 
{ 
    protected $group; 
    public function __construct($message = "", $group = null, $code = 0, \Exception $previous = null){ 
     $this->group = $group; 
     return parent::__construct($message, $code, $previous); 
    } 
    public function getGroup(){ 
     return $this->group; 
    } 
} 

は、次の構文を使用して例外をスローすることができます

throw new AnswerException('template has invalid tag',$tag); 

その後、あなたはAnswerExceptionをキャッチし、$exception->getGroup()機能を使用することができます。

+0

が、それは '__construct($メッセージ= ""、$グループ=すべきではありませんnull、$ code = 0、... '? – h2ooooooo

+0

はい、そうですが、修正しました。ありがとう。 –

+0

ありがとう。より広範であるため、@axiacの回答を受け入れましたが、同じアプローチを示唆していますので、ここでも正しいです、Oleg。 – romaninsh

関連する問題