2009-07-07 1 views
1

に使用おろか格別なもの - ちょうどロジックの決定、検証...ウェブページで例外(AB)が、でも本当にエラーではない状況のために私は自分自身がWeb開発で例外を使用して検索するWeb開発

、私はよくそうのようなコードを書く:これは本当に例外を使用してWeb開発でビジネスロジックを強制する正しい方法であれば、私は思っていた

try 
{ 
    int id; 
    if(!int.TryParse(txtID.Text, out id)) 
     throw new Exception("ID must be an integer"); 

    if(IdAlreadyExists(id)) 
     throw new Exception("ID already exists in database"); 

    //and so on... 
} 
catch(Exception ex) 
{ 
    SetErrorLine(ex.Message); 
} 

P.S.私はasp.netを使用していますが、明らかにこれらのいくつかにはASP.NETバリデーターを使用でき、ロジックからは別個のUIを使用することもできますが、一般的な考え方を指摘しています。

+0

あなたのほとんどがこのような行為に反対しているようだが、私はまだそれが行われるべき方法に欠けています。 例外を使用してBLからメッセージを渡すのは本当に簡単ですが、どうすればそれらを使用せずに行うのですか? エラーメッセージが発生した場合にそのエラーメッセージを保持する出力文字列を渡し、その後UIでSetErrorLine(myMessage)を渡しますか? まだ、 のモデルtry {do_bl_stuff(); } catch(例外ex){SetError(ex.message);} }最も簡単で、実際には最もクリーンなようです。あなたはそれをどうやって行うのかの例をペルシェスに与えることができますか? –

+0

なぜ、単にparseを使用して例外をスローする代わりにtryparseを使用して例外をスローすると、.netはその例外自体をスローしますか?私はちょうど期待どおりにIDを使用し、多くの行が影響を受けているかどうか(何かが存在し、私の挿入が静かに失敗する)を見るためにexecuteNonQuery()をチェックします。 –

答えて

6

本当にあなた自身の質問にちょうど答えました。

例外は例外的な状況です。投稿したコードが、ユーザーからの入力として「ID」を取るページから来たと仮定すると、ユーザー入力が悪いことは例外ではありません。検証インフラストラクチャを使用するか、手動で行うが、例外は使用しないでください。

また、Exception.Messageをユーザーに表示するという習慣に慣れないでください。これは、開発者が何がうまくいかなかったのか、それを修正する方法を知ることを目指すことを意味します。

1

最初の例が例外の許容される使用であるとは考えません。ユーザーは簡単にその情報を入力することができ、ユーザーの入力は、とにかく検証されるべきです。

例外は '例外的'である必要があります。あなたが起こることを期待していない何かが起こらないか、本当には起こりたくありません。例外をスローする前に検証または処理できるものは、エラーのように扱うだけです。

0

異なるコミュニティでは、許容される例外の使用方法が異なります。 http://wiki.sheep.art.pl/Ask%20for%20Forgiveness

私は、アプリケーションのロジックを混乱させない限り、それらを使用するファンです。

+0

@Dan:.NET例外は例外的な条件で使用するように設計され、最適化されていることに注意してください。それが設計されていない方法でフレームワークを使用するのは間違いです。 –

0

グローバル例外ハンドラHttpModuleを追加してasp.netに追加して、未処理の例外をキャッチすることは、try/catch/finally abuseからあなた自身を訓練する非常にクリーンな方法です。

0

メソッドが引き継ぐ前提条件が壊れている場合や、メソッドが単純に完了できない場合は、例外をスローします。

この例では、IdAlreadyExistsメソッドがデータベースにクエリを実行する場合があります。この方法では、接続するデータベースがあること、必要なものを実行するのに十分なメモリがあることなどを前提としています。仮定が壊れている場合は、例外をスローします。

私は、1つは低レベルのコードで例外をスローし、上位のコードは例外をキャッチするようにします。それは難しくて速いルールではなく、私が従いたい一般的なガイドラインです。通常は例外を同じレベルにスローする必要はありませんが、時にはそれが理にかなっていると想像することができます。

0
still missing the way it SHOULD be done 

エラーメッセージを設定して戻ります。

ログに記録されます。ユーザーには表示されません。

protected void Button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     int id = 0; 
     if(!int.TryParse(txtID.Text, out id)) 
     { 
      SetErrorLine("Thats not a valid number dude! Need to go to school again"); 
      return; 
     } 

     if(IdAlreadyExists(id)) 
     { 
      SetErrorLine("I already have this entry in store. Sorry. Call again!"); 
      return; 
     } 

     ...the rest of your code 
    } 
    catch(Exception ex) 
    { 
     _log.Error(ex); 
     SetErrorLine("Something unexpected happened dear user ... "); 
    } 
} 

編集:あなたのコメント

try { 
    string error = ""; 
    int id = 10; 
    if(BO.DoSomething(out error, id, otherParams)) 
    { 
     SetErrorLine(error); 
     return; 
    } 
} 
catch(Exception ex) 
{ 
//log 
} 

私の推測:

try { 
    string meaningfullErrorMessage= ""; 
    int id = 10; 
    if(!BO.DoSomething(out meaningfullErrorMessage, id, otherParams)) 
    { 
     SetErrorLine(meaningfullErrorMessage); 
     return; 
    } 
} 
catch(Exception ex) 
{ 
//log 
} 
+0

したがって、すべてのビジネスオブジェクトに対して、これは推奨構文になります。 try { string error = ""; int id = 10; if(BO.DoSomething(outエラー、id、otherParams)) { SetErrorLine(error); リターン; } } catch(例外ex) { // log } –

+0

編集されたコードを参照してください。それはあなたが返すエラーメッセージに依存します。それが意味のあるメッセージであれば、これは正しいでしょう。 ex.Messageをoutエラーに割り当てるのであれば、それはokではありません。あなたのBOは、それが捕まえる例外をもう一度投げるべきです。そうしないと、スタックトレースが失われます。 –

関連する問題