2012-02-29 17 views
5

私は、私が取り組んでいるプロジェクトでちょっと穴を開けました。私はこの大規模なプロジェクト(何千もの行数)を持っており、どこにでもMySQLのエラーがあります。私は今それらを掃除する過程にある。実行を停止せずに例外をスローしますか?

すべてのクエリが通過するこのデータベースクラスがあるので、SQLエラーが発生したときはいつでも例外をスローします。問題は、私は実行を停止することができないということです。それはいつものように続行しなければならず、例外をログに記録するので、一度に1つずつ修正して修正することができます。

set_exception_handlerが私の望むことを望んでいましたが、文書管理者はハンドラを呼び出した後に実行を停止すると具体的に言います。では、どうすればこの問題を回避できますか?

例外は現在の関数を停止することができますが、関数から抜けて、おそらくnullまたはfalseを返してから通常どおりに処理したいのですが、グローバル例外ハンドラを呼び出す必要があります。

を私が(SQLエラーがあるたびに)私のデータベースクラスから例外をスローします:明確にする


。私はこのエラーを記録し、SQLエラーを修正するか試行錯誤の中で問題のある行を折り返すまで、画面にメッセージを表示したい。私はそれが実行を中断させたくない。例外を投げるのではなく、私が単にerror_handler()という関数を呼び出すと、私はそれをキャッチできません。私はすぐに(DBクラス内で)それを捕まえると、私はそれをスタックの下にさらに捕らえることができません(もし私がそれを再投げなければ、実行を中止する)。

+0

あなたは既にした場合、その後

そして

は、同じ例外ハンドラは、まだ実際にスローされている他のすべての例外をキャッチするために使用することができますMySQLのエラーを例外に変換するコードを更新しました。例外をスローするのではなくエラーをログに記録するのはなぜですか? – pgraham

+0

@pgraham:ええ、それは良い質問です。その理由は、グローバル例外ハンドラに落とさないようにするために、例外を捕捉できるようにしたかったからです。さらに、集中処理された例外処理とログ機能が必要です。最後に、エラーを一掃したら、グローバル例外ハンドラを少し修正して、実際には*死ぬことになり、致命的なエラーが発生するようにしたい。 – mpen

+1

@downvoter:これが悪い質問である理由を説明してください。 – mpen

答えて

0

私は回避策を見つけたと思います。代わりに例外をスローで、私は例外を除いて、直接私のハンドラを呼び出すことができます。

global_exception_handler(new MySqlException($error_message)); 

方法私のハンドラはまだ呼び出されますが、実行は継続すること。

function _global_exception_handler($e) { 
    // log error here 
} 

set_exception_handler('global_exception_handler'); 
+0

*回避策*ではありません。 – Alexander

+0

これはデバッグ印刷を追加するようなものですか? – alfasin

1

私が正しくあなたを理解している場合:

function myFunction($params) { 

    try { 

     //your code which throws Exception 

    } catch (Exception $e) { 

     myErrorFunction($e); 
     return false; 
    } 

} 
+0

いいえ、私はあなたが私の全要件を理解しているとは思いません。私はtry/catchをどこに置くのですか?私はすぐにすべての単一のSQLクエリの周りに置く時間がないので、私はそれを投げる場所に正確に置く必要があるだろう...しかし、私はそれを捕まえていないので、私はすでにそれをキャッチした。私は自分がしたいことが可能だとは思わない。 – mpen

+0

コード全体をラップすることも、データベースクラスで使用することもできます。いくつの方法がありますか? 10? 20? try catchとそれを実行するたびに、 '$ db-> myCustonQuery()'のように、エラーが発生した場合、他のどこかで処理できる例外がスローされます。この答えの真のポイントは、あなたが 'falseを返すと、実行を続けることができるということです。 – Shoe

+0

コード全体をラップすると、例外がスローされると、そのポイント(catch)に実行が落ちます。私はそれがどこで(投げで)中断したかをかなり続けなければならない。いくつの方法がありますか?私のDBクラスでは何ですか? 10-20は合理的な見積もりですが、それらをラップしても、私が望むところでそれを捕まえることはできません。基本的に私は '$ db-> GetSingleRecord()'と呼んでいますが、オプションで何千もの呼び出しがあり、それらをすべて実行しなければならないため、*捕捉できるようにしたいと思います。それは理にかなっていますか?私が求めているのは非現実的だと思うが、それが最適なケースだろう。 – mpen

関連する問題