Magentoで例外をスローする好ましい方法は何ですか?


45

次のすべての方法がMagentoコアで使用されていますが、どの方法が好ましい(または最新の「ベストプラクティス」)方法でしょうか。

  • Mage::throwException('Some Message')- 732の用途
  • throw new Exception('Some Message')- 419の用途
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94の用途
    (作成する必要Vendor_Module_Exceptionクラス)

2
実行カウントをどのように見つけましたか?それを知る好奇心を求めています!!!
ラジーエフKトミー14年

1
@RajeevKTomyコマンドラインからgrepを推測しています-何かのようにgrep -r throwException /path/to/magento/app/code/core | wc -l ; grep -r throw\ new /path/to/magento/app/code/core | wc -l ; grep -r throw\ Mage /path/to/magento/app/code/core | wc -l-ただし、何を探すのかを知っている必要があります。
ダグ・マクリーン

回答:


36

この呼び出しMage::throwExceptionは、特定のMage_Core_Exception種類の例外をスローするために使用されます。これらは通常、エンドユーザーにエラーメッセージを表示するために使用されます。この例についてMage::throwExceptionは、Mage_Checkoutモジュールでクイック検索を行うと、エラーメッセージが実際に翻訳される前に、スローされる前に多くのインスタンスが見つかります。最終的にセッションオブジェクトに追加され、ユーザーに表示されます結果のページ。

通常、を使用するnew Exceptionnew My_Custom_Exception、アプリケーションの内部でエラーをスローします。エラーはエンドユーザーに表示されることはほとんどありません。これらをキャッチして適切に処理する場合もあります(場合によってはカスタム例外タイプに適しています)、または、キャッチされ、ログに記録されてリクエストが終了する場合もあります。

私は個人的に使用しMage::exceptionたことはありませんが、各モジュールに固有の例外タイプを持つパターンを作成しようとしているようです。これは基本的に指定されたモジュールの例外インスタンスを返すファクトリであるため、使用しても害はありませんが、(この記事の執筆時点では)オーバーライドなどのサポートは実装していません。


私はここであなたの推論が好きです-それは平易な英語です:)
philwinkle

Mage::throwException('my error message')ヘルパークラスを呼び出しましたが、何も起こりませんか?
ブラック

16

あなたは難しい部分をやり終えて、それらがどれくらいの頻度で使用されているかを調べました:)

tl; dr:私見、Mage::throwException最も頻繁に使用Mage::exceptionする必要があります。モジュールのスコープ外から例外タイプを発生させる必要がある場合にフォールバックします。そのthrow new前に入力する必要があります。

内訳は次のとおりです。

  • Mage::throwException基本的にはMage_Core_Exception($message)、次のgetSingletonようにチェーンされた呼び出しを介してセッションに例外を追加できる追加機能を備えたラッパーです。addMessage
  • new Exception()は例外をスローするためのPHPの中心的な方法ですが、throwキーワードを使用する必要があり、他の2つは追加機能を備えたラッパーであるため、おそらく最も「パフォーマンスの高い」ものです。
  • 前述のようにMage::exception、ラッパーでもありますが、独自の例外クラスをインスタンス化できるという利点があります。これは、プラグイン開発者であり、例外のカスタムログを個別に作成する必要がある場合(スタックトラックがないなど)、または例外時にAPI呼び出しを行いたい場合などに非常に役立ちます。異なるクラスタイプの例外、たとえばで何が起こるか、例外タイプを頻繁に発生さlogExceptionせたいthrow場合。Mage_PaypalMage_Core

タイミングについて話す... 10秒未満の間隔。:)
デビダルガー

との間の好みの理由は、せいぜい明らかnew Exception()Mage::exception()はありません。Mage::exception()コードを調べても、の利点throw $exceptionは見当たりません。実際に、クラス名にプレフィックスを付け、静的分析を妨げ、例外を直接スローするときに、追加のメソッドを呼び出すことはできません。
-hakre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.