0

エラーが発生したときにさまざまなカスタム例外をスローするPHPライブラリを構築しています。これらの例外をログに記録し、ファイルまたはデータベースに記録できるように、ロガーのさまざまな実装を提供する必要があります。

例外は、キャッチされているかどうかに関係なくログに記録する必要があるため、カスタム例外ハンドラーにこれを実装することはできません。したがって、カスタムExceptionクラス自体のコンストラクターでロギングをトリガーする必要があります。

また、phpUnitを使用して、例外がロガーをトリガーすることを単体テストする必要があります。

LoggerオブジェクトにアクセスできるExceptionオブジェクトの最良の方法は何ですか?

私が持っていたアイデア/提案は次のとおりです。

1)選択したロガー実装オブジェクト(または例外クラスをテストする場合はMockオブジェクト)を例外をスローするオブジェクトに挿入します。これらのオブジェクトは、新しい各例外をスローするときにコンストラクターにロガーオブジェクトを挿入します。Loggerオブジェクトがいたるところに渡されているため、これは少し厄介になる可能性があります。

2)戦略またはファクトリパターンを使用します(概念については読みましたが、この場合、これらを実装する方法がわかりません)。

4

1 に答える 1

1

それは

例外ハンドラーを使用する代わりにロガーを持つ例外のアプローチには欠陥があると思います。IMO、関心の分離に違反しているため、例外にロギングロジックを含めることはできません。ただし、それが必要な場合は、静的メンバーとしてロガーコンポジットを持つカスタム例外を作成できますが、それでも、この例外からサブクラス化されていないすべての例外のログは記録されません。runkitを使用してPHPの基本例外の動作を変更できますが、それはダーティブラックブードゥーマジックモンキーパッチです。

于 2010-10-27T09:21:07.713 に答える