2017-10-13 21 views
2

try catchを動作させる方法を理解できません。テキストボックスに数字以外を入力すると、エラーメッセージボックスがポップアップする必要があります。try catch does not working

private void btnAdd_Click(object sender, EventArgs e) 

    { 
     int x = int.Parse(txtIn1.Text); 
     int y = int.Parse(txtIn2.Text); 

     txtIn1.Text = x.ToString(); 
     txtIn2.Text = y.ToString(); 

     lstOut.Items.Add((x + y).ToString("N0")); 

     try 
     { 
      int.Parse(txtIn1.Text); 
      int.Parse(txtIn2.Text); 

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

最初の2つの 'int.Parse'呼び出しは' try/catch'にありません。 [TryParse](https://msdn.microsoft.com/en-us/library/f02979c7%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) –

+0

あなたは '' int .Parse(txtIn1.Text); '' '二度、どうしたの? –

+0

TryParseを使用するだけです – maccettura

答えて

4

最小限の変更で:すべてのコードをtryに移動して、例外が発生したときにキャッチします。あなたはtryブロックの外で例外が発生しています。対応するtryブロック内の何かが例外をスローした場合にのみ、catchがトリガされることを常に見ています。

private void btnAdd_Click(object sender, EventArgs e) { 
    try { 
     int x = int.Parse(txtIn1.Text); 
     int y = int.Parse(txtIn2.Text); 

     txtIn1.Text = x.ToString(); 
     txtIn2.Text = y.ToString(); 

     lstOut.Items.Add((x + y).ToString("N0")); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
     return; 
    } 
} 

編集:コメント欄で示唆したように、私はこの答えはtry/catchブロックは、このインスタンスではやり過ぎであることを示すことなく、不完全であると思います。

より良いアプローチは、組み込みのTryParseメソッド(解析の成功と出力値に関するブール値を返すことができる)を使用することです。ここでは、これを実現する可能性が一つの方法は次のとおりです。

private void btnAdd_Click(object sender, EventArgs e) { 
    var xSuccess = int.TryParse(txtIn1.Text, out int x); 
    var ySuccess = int.TryParse(txtIn2.Text, out int y); 

    if(!xSuccess) 
    MessageBox.Show($"{x} could not be parsed to int!"); 
    if(!ySuccess) 
    MessageBox.Show($"{y} could not be parsed to int!"); 

    if(xSuccess && ySuccess) 
    lstOut.Items.Add((x + y).ToString("N0")); 
} 
+1

単純な 'int.TryParse()'がtry/catchのようなオーバーヘッドを伴わないで、単純な 'int.TryParse()'を使用しないでください。 – maccettura

+0

@maccettura 私はあなたの意見に一般に同意します。このケースでは、ブロックが実際にどのように機能するのかを示す目標を達成するために、コードに最小限の調整を加えることを目指していました。おそらく、ブロックがどのように実行され、Try/Catchの代わりにTryParseを使用するかを説明するのがより良い解決策でした。 ご意見ありがとうございました – Miek

+1

あなたの質問をいつでも編集してより良いやり方を含めることができます。あなたは質問に答えるだけではないことを覚えておいてください。それはまた、学習の機会です。したがって、OPが異なることができる何かを見たら、それらを知らせるようにしてください! – maccettura

3

this SO postで説明したように、あなたがコントロールするブロックとしてのtry-catchを使用しないでください。それにはifを使用してください。試してキャッチしようとすると、あなたがそうでないときや何かがあなたはが起こったことを期待していないときに使用されることを意味します。

あなたは一例としてthis SO postを使用することができますし、あなたのコードは、あなたがVARSが適切に値

を与えられたことを確認するために

Console.WriteLine(x); 
Console.WriteLine(y); 

を使用することができ、この

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    int x; 
    int y; 

    if(!int.TryParse(txtIn1.Text, out x) || !int.TryParse(txtIn2.Text, out y)) 
     MessageBox.Show("Parse failed !");   
} 

ようになります。 int.TryParse()メソッドの詳細については、int.Parse()を参照してください。this post

2

他にも触れたように、try/Catchブロックの外側にあるものを上回る最初のint.Parse()関数です。

私はTryParse()関数を拡張したかったのですが、なぜそれを使用しているのでしょうか。

例外は高価です - 時間/ CPU /などの点でかなり大きなオーバーヘッドです。ユーザーフレンドリーではありません。 「例外が発生しました:...」ではなく、「有効な番号を入力してください」と言いたい場合は、代わりにTryParseを使用します。解析の出力は、入力リストに「アウト」パラメータです:

​​

これは例外のオーバーヘッドを持っていない - それは関係なく、かどうか、入力の有効なの、すぐに実行されます。

1

別のアプローチを使用してみませんか?

private void txtIn1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (!char.IsDigit(e.KeyChar) /* || add more conditions*/) 
     e.Handled = true; // Prevent key to be added to the TextBox' text. 
} 

今、あなたは非数字があなたのstringであるかどうかをチェックする必要はありません。

TextBox.KeyPressイベントを使用してください。

お客様の声明int.Parse(txtIn1.Text);は確実に機能します。