2016-05-16 12 views
1

まず、これは私が取り組んでいる課題ですが、これは必須条件ではありません。私はdecimalメソッドでtry/catchステートメントを使用しようとしています。小数点以下のメソッドでtry/catchを実行するC#

private decimal NewCar() 
    { 
     decimal newCar = 0.00m; 

     try 
     { 
      newCar = decimal.Parse(vehicleTextBox.Text); 
     } 
     catch (FormatException) 
     { 
      MessageBox.Show("Invalid entry (Format Exception). \n" + "Please enter a valid decimal number."); 
      Keyboard.Focus(vehicleTextBox); 
      vehicleTextBox.SelectAll(); 
      return; 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Invalid entry (General Exception). \n" + "Please enter a valid decimal number."); 
      Keyboard.Focus(vehicleTextBox); 
      vehicleTextBox.SelectAll(); 
      return; 
     } 

     if (newCar < 0) 
     { 
      MessageBox.Show("Invalid entry (Negative Value). \n" + "Please enter a valid decimal number."); 
      Keyboard.Focus(vehicleTextBox); 
      vehicleTextBox.SelectAll(); 
      return; 
     } 

     return newCar; 
    } 

私が得る、私は「『小数』にコンバーチブル型のオブジェクトが必要です」というエラーが出るが、私はそこnewCar変数を入れた場合、またはのtry/catchでreturn文を削除あまりにも多くのメッセージボックスと計算を停止しません。他の計算で使用する小数の方法である必要があります。

助けてください。

+0

は、それが有効な入力であるかどうかを調べるためにトライキャッチを使用しないでください。一般に、これは良い習慣ではありません。代わりにDecimal.TryParseを使用してください。 –

+0

newcarメソッドを呼び出したイベントはありますか?そのコードを表示することもできますか?また、何も返さないreturn文を使用して、ある種の戻り値型を持つメソッドから戻ることはできません。 –

+0

私はこれを私の望むように動作させることができず、 'calculate_button'メソッドの中で' try-catch'を使うことに決めました。計算に使われたさまざまなメソッドで 'decimal.Parse(vehicleTextBox.Text)'を参照しました。 。すべてが今やうまくいくようです、回答の皆様に感謝します! – Jaqtaris

答えて

4

あなたのメソッドは10進数を返します。だからあなたは小数を返す必要があります。 returnと書くことはできません。何も返さないことを示しています。

ここでは、エラー処理をメソッドから外して、例外をバブルアップさせることができます。あなたのメソッドは車の値を解析しているので(方法によっては、NewCarはそれが新しいcarオブジェクトを作成していることを示しています)、必ずしもユーザーと対話する必要はありません。それは、テキストを解析し、小数点を与えるだけの目的です。

だから、あなたは2つのオプションがあります。あなたは、適切な値を返すことができるように

  1. あなたの方法は、(例えば、-1)エラーコードを返します。別のオプションは、 'Successful'フラグ、データ、および考えられる例外を格納するラッパークラスを作成することです。
  2. 例外を単純にバブルアップさせます。
+1

私はこのメソッドの外でエラー処理をしていましたので、これは私には意味があります。それを動作させる方法があるかどうかを調べようとしていたので、下記のTryParseメソッドを試してみましょう。 @Saeed Jahed – Jaqtaris

1

Robさんの正確で優れた答えに追加するには、キャッチ例外以外にもTryParse(...)を使用することをおすすめします。あなたのケースでは

private void NewCar() { 
    decimal newCarValue; 

    if (decimal.TryParse(vehicleTextBox.Text, out newCarValue)) 
    { 
     // valid decimal. 
     // now validate the value of decmial 
     if (newCarValue >= 0) 
     { 
      // All good. Do the work with car here. 
     } 
     else 
     { 
      // complain 
     } 
    } 
    else 
    { 
     // complain 
    } 
} 

、あなたは悪い考えですExceptionクラスをキャッチしています。あなたのコードにバグがあったとしたら、車の作成中にNullReferenceExceptionという結果に終わったとします。無効な値を入力したことをユーザーに伝えます。実際には埋め込まれているコードのバグだけです。

+1

TryParseメソッドは、outパラメータであるため、 'newCarValue'変数に' out'キーワードが必要です。 –

+0

@ChrisDunawayああ良いキャッチ。更新しました。 –

0

確かに、最後のもの以外のすべてのreturn文が間違っているため、10進数を返していないので、コンパイラは文句を言う。このメソッドの外にあるMessageBoxのロジックを取ることをお勧めします。あなたが番号を確認したい場合は は、私がintead TryParseメソッドを使用することをお勧めいたしますでしょう正しく変換されました:

private void TheFunctionThatWasUsingNewCar() { 

    decimal newCar; 
    //send the uninitialized newCar variable to TryParse. If everything went ok, the variable will contain the equivalente decimal value. 
    if(! Decimal.TryParse(vehicleTextBox.Text, out newCar)){ 
     //You can be almost certain that if the conversion failed it's because of the format 
     MessageBox.Show("Invalid entry (Format Exception). \n" + "Please enter a valid decimal number."); 
     KeyBoard.Focus(vehicleTextBox); 
     vehicleTextBox.SelectAll(); 
    } 
    //Validate the converted number was not negative 
    if(newCar < 0){ 
     MessageBox.Show("Invalid entry (Negative Value). \n" + "Please enter a valid decimal number."); 
     KeyBoard.Focus(vehicleTextBox); 
     vehicleTextBox.SelectAll(); 
    } 

    //At this point you have your newCar variable and it's valid. 
} 
関連する問題