最近、CodeIgniterで構築した学校向けのプロジェクトを提出しました。私はそれを先生に提示する必要があり、特定のエラーをどのように処理するかを尋ねられたとき、彼は例外をスローして、一連のイベントのかなり前に物事をインターセプトするように指示しました。
例外をスローする方法、およびtry...catch
ブロックを使用してそれらをキャッチして処理する方法を学びましたが、CodeIgniterを使い始めたとき、何もかも忘れてしまい、実際には例外を使用しませんでした。
代わりに、より適切なWordがないため、エラーを「手動」で処理しました。たとえば、TRUE
およびFALSE
ブール値を使用して、たとえばクエリが適切に実行されたかどうかを確認します。返されたブール値を使用して、クエリの結果を処理します。 TRUE
の場合、私は先に進み、自分の作業を行います。FALSE
の場合、「手動で」エラーメッセージをスローします。プロジェクトはAJAXに非常に依存しており、エラーメッセージは非常に奇抜な方法でポップアップ表示され、ページの上部からドロップダウンしました。 throw new Exception
で例外をスローしたときにこれが可能かどうかわからないこれは、例外がスローされたときに基本的にコードの実行を停止することを知っています。
また、例外をスローすることはこれまでのベストプラクティスではないことをどこかで読んだことを覚えているようですが、これの原因を見つけることができず、これが当てはまるかどうかはよくわかりません。結局のところ、クラスでそれらを使用する方法を学びました。私はそこでベストプラクティスを学んだと信じたいです。
必要に応じて、前に戻って、例外をスローするべきだったと彼が指摘したコードを見つけようとしました。ただし、今のところ、コードで例外を使用する必要があるか、手動で処理する必要があるのか疑問に思っています。これに関するベストプラクティスは何ですか?
ありがとう。
ちなみに、コハナでよく使用しているCodeIgniterでは例外を使用していません。フレームワークが例外をスローし、CodeIgniterとは異なり、すべてが例外を処理するように設計されているからです。例外を使用することは、すべてのクラス/フレームワークが例外と連携するように設計されている場合に適しています。
私はフレームワーク比較ディスカッションに参加したくありません(実際にはしないでください)が、質問を明確にするために、2つのコードを比較する必要があります。より良いオブジェクト指向の実装で)。
このCI2コードが表示されます...
try
{
$result = $this->db->insert('entries', $this->input->post());
// This is not useful.
if ( ! $result)
{
throw new Exception();
}
}
catch (Exception $e)
{
// Do something
}
あまり役に立ちません。このコハナ3コードと比較してください。
try
{
$entry = ORM::factory('blog');
$entry->values(Request::current()->post());
$entry->save();
}
catch (ORM_Validation_Exception $e)
{
Session::instance()->set('form_errors', $e->errors(TRUE));
}
これは便利で、例外をスローせず、レコードの保存を処理するクラスによってスローされ、$e->errors
にはすべての検証エラーがあります。すべてが例外を使用して機能するように設計されている場合、それは良い方法であり、非常に便利な方法であると確信できます。しかし、それはCI2の場合ではないので、例外を使用せずに先に進むと言うべきかもしれません。
try
{
$this->load->model('blog');
$this->blog->save_entry($this->input->post()); // Handle validation inside the model with the Form_validation library
}
catch (Validation_Exception $e) // You throwed your custom exception with the failed validation information
{
// Do something with your custom exception like the kohana example
$this->session->set('form_errors', $e->errors());
}
私はすべてが理解可能であることを望み、おそらく別の興味深い意見とより効率的な実装を持つ誰かがいるでしょう。さようなら。