2009-04-15 10 views
2

悲しいことに、私は従来のPHP4システムを利用して、機能を追加する必要があります。数年でなくても数ヶ月間PHP5に移植するためのリソースがあるようには見えません。ここ数年の間、私を悩ませた主な事の一つは、例外をきれいに投げる能力がないということです。このため、あらゆる種類のエラーチェックコードは、何が起こっているのかを常に妨害しなければなりません。ベスト代替例外処理モデル

したがって、例外モデルのない言語での例外処理の清潔さをエミュレートするのに最適な戦略は何ですか?

ジョエルは、これが答えで述べたように、例外について言っている:

http://www.joelonsoftware.com/items/2003/10/13.html

は、彼らが機能するためにあまりにも多くの可能な出口ポイントを作成します。正しいコードを書くためには、あなたの関数を通して考えられるすべてのコードパスについて考える必要があります。例外を発生させてその場でキャッチしない関数を呼び出すたびに、突然終了した関数や矛盾した状態のまま残った関数、またはそれ以外のコードのパスによって引き起こされる不思議なバグの機会が生まれますについて考える。

より良い方法は、関数が間違っているときにエラー値を返し、どれほど冗長であっても明示的に処理することです。シンプルな3行プログラムでなければならないことは、エラーチェックを入れたときに48行に咲くことがよくありますが、それは人生だと思います。プログラムをより堅牢にするわけではありません。私は、C/C++/Javaスタイルの言語のプログラマが例外に惹かれている理由は、構文が複数の値を返す関数を簡潔に呼び出すことができないため、戻り値を生成する関数を書くのは難しいからです値を返すか、エラーを返します。

ただし、言語の優れた例外モデルでは、実際に例外をスローするように呼び出される関数を指定します。これは、関数が終了する場所がexaactly 0であることを意味します(コードは単に例外をスローするのではなくfalseを返します)が、関数が終了する場所はまったく1つだけです。呼び出し関数。誰でもすることができます他の人が扱うようにすべての例外を上に通過するコードがありますが、それはあなたを意味するものではありませんはきれいに効率的に使用できるツールを取り除かなければなりません。

実際、関数は呼び出し元コードから期待される戻り値の範囲外の値を返すことがあります。優れたプログラマは、エラーコードや条件を含むすべての可能な戻り値を処理します。例外モデルは、彼にそれをきれいにする方法を与えます。

答えて

3

まず、one of the founders of this siteを含む例外が正しいエラーモデルではないと思う人がいます。

第2に、マイナーバージョンのPHPで使用できるエラー処理関数のインベントリを取得しようとすることです。私の即時の反応は、良いエラーハンドラを書こうと時間を費やすことを示唆し、register itです。

通常、例外をスローするアプリケーションの実行では、代わりにtrigger errorsを使用できます。運がよければdebug_backtrace()を使用できます。

幸運を祈る!

+0

私は実際にはエラーハンドラを作成してみましたが、ローカルファイルにローカルエラー処理を保存する方法はわかりませんでした。 1つの考えは、debug_backtraceの結果を使用して現在のクラスを把握し、そのクラスに対して特定の "handle_error"メソッドを呼び出すことでした。どう思いますか? – Zak

+0

私は間違いなく動作すると思いますが、正直なところです。私はおそらく3年後にPHP4で作業していません。おそらく長く。あなたがそれを有効にすることができれば、ここにコメントを残してください! –

2

Continuation passing style。実際、私は「かわいらしさ」という点で例外を凌ぐと言っています。 PHPに収まるのは最も自然なことではありませんが、訪問者などのオブジェクトやパターンを使用して行うことができます。

実際、PHP4からPHP5へのアップグレードは数時間を要しません。ほとんどの場合、後方互換性があります。

+0

-1 "わずか数時間の作業"です。私は自分自身に言った有名な嘘の下にファイル: –

+0

アランを理解し、そこにあった、Tシャツ、お土産のマグ、素朴な帽子と時間シェア=)を買った –

+0

ハハ@Alan - 確かに。 CPSを使用するために既存のコードベースを改造することは、それ自体の難題です。 –