-9

ここにコードがあります

    private void btngetage_Click(object sender, EventArgs e)
    {
        try
        {
            string a = txtAge.Text;
            DateTime bday = new DateTime(int.Parse(txtbday.Text));
            DateTime today = DateTime.Today;

            int age = today.Year - bday.Year;
            if (bday > today.AddYears(-age))
                age--;
            txtAge.Text = age.ToString();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
4

3 に答える 3

4

このようなことをすると、

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

デバッグが難しくなります。ここで、エラーを含む行で停止するのではなく、デバッガーはまったく停止しません。既にエラーを処理しているため、メッセージ ボックスを表示して次に進みます。

予期して処理しようとしている例外をキャッチする場合を除いて、catch ブロックを使用しないでください。Exceptionそして当然の結果として、基本クラスには絶対に処理できないサブクラスがたくさんあるため、絶対にキャッチしないでください ( などOutOfMemoryException)。特定の派生例外を常にキャッチします。

または、例外をまったくキャッチしないでください。必要に応じて使用できる、ハンドルされないグローバル例外ハンドラーがあります。デフォルトでは、例外に関する情報を含むアラートが表示されます。(これは本質的に上記のコードと同じことですが、はるかに優れています。)

価値のない catch ブロックを削除すると、デバッガーは次の行で停止します。

DateTime bday = new DateTime(int.Parse(txtbday.Text));

メソッドが例外をスローしていることと、int.Parseそれがどのタイプの例外であるかがわかります。入力 ( txtbday.Text) は有効な整数ではないため、整数に変換できないことがわかります。

FormatExceptionエラーをキャッチして処理することでこれを解決できますがTryParse、例外をスローしないメソッドが提供されているため、そうする理由はありません。代わりに、成功または失敗を示す bool を返します。if ステートメントでそれをテストします。文字列を解析できない場合は、ErrorProviderコンポーネントを使用して、入力した文字列の問題をユーザーに警告します。

于 2013-08-06T15:23:31.467 に答える
0

これの代わりに

DateTime bday = new DateTime(int.Parse(txtbday.Text));

あなたの質問から得られるのはこれだけですが、これを行う必要があります。

DateTime bday;
if(DateTime.TryParse(txtbday.Text.Trim(),out bday))
{
    //your rest of code
}

注: テキスト入力を取得するには、Textboxコントロールを使用する必要があります。日時入力の場合、コントロールを日時ピッカーに変更します。解析を行う必要はありません。

于 2013-08-06T15:19:05.843 に答える