1

Web ページに次のコードがあります。

btnTest_Click(object sender, EventArgs e)
{
    ...
    bool ret=myFunc(...);
    if (ret)
    {...}
    else
    {
        lblStatus.Text="Some Text";
        lblStatus.Visible=true;
    }
}

private bool myFunc(...)
{
    bool ret=false;
    try
    {
        ...
        ret=true;
    }
    catch (Exception ex)
    {
        lblStatus.Text="Other Text";
        lblStatus.Visible=true;
    }
    return ret;
}

myFunc で例外が発生した場合、lblStatus には常に「その他のテキスト」ではなく「一部のテキスト」が表示されます。つまり、myFunc の catch ブロックは実際には何の意味もありません。このコードを修正して、例外をより適切に処理するにはどうすればよいでしょうか?

更新:私の例はあまり良くないかもしれません。しかし、私の主な目的は、関数の呼び出しと呼び出される間の例外処理のベスト プラクティスを尋ねることです。

4

7 に答える 7

4

呼び出された関数が例外でラベル テキストを設定し、呼び出し元が成功でそれを設定するのはなぜですか?

それは混合比喩のようなものです。一方が UI (関心の分離) を担当し、もう一方が作業を担当します。呼び出された関数を耐障害性にしたい場合は、次のようにしてみてください。

private bool myFunc(...)
{
  bool ret ;
  try
  {
    ...
    ret=true;
  }
  catch
  {
    ret = false ;
  }
  return ret;
}

次に、呼び出し元は次のようなことができます。

bool success = myFunc(...) ;
lblStatus.Text = success ? "Some Text" : "Other Text" ;
lblStatus.Visible = success ;

if ( success )
{
  // do something useful
}
于 2013-11-11T23:00:42.227 に答える
0

例外処理は問題ありません。"Some Text"コードの問題は、戻り値が の場合に文字列をラベルに入れていることですfalse。これは例外が発生した場合であるため、catchブロックからのメッセージが置き換えられます。

ケースを切り替えます。

if (ret) {
  // it went well, so set the text
  lblStatus.Text="Some Text";
  lblStatus.Visible=true;
} else {
  // an exception occured, so keep the text set by the catch block
}
于 2013-11-11T23:01:16.170 に答える