• ベストアンサー

Try, Catch についての質問

すみません!!VB超初心者です。 PriceとCostのテキストボックスにマイナスやアルファベットを記入して計算ボタンを押した場合、Errorを示すメッセージボックスを出したいのです。 ところが、このプログラムだとちゃんと正の数字を入れた場合でもエラーのメッセージボックスがでてしまいます・・・。これはなぜなのでしょうか?よろしくお願いします! Dim priceDecimal, costDecimal, answerDecimal As Decimal Try priceDecimal = Decimal.Parse(txtprice.Text) costDecimal = Decimal.Parse(txtcost.Text) answerDecimal = Decimal.Parse(lblcomission.Text) Try txtprice.Text = priceDecimal < 0 txtcost.Text = costDecimal < 0 Catch priceException As FormatException MessageBox.Show("You have entered Invalid Data.", "Error", MessageBoxIcon.Exclamation) End Try Catch costException As FormatException MessageBox.Show("You have entered Invalid Data", "Error",MessageBoxButtons.OK, (MessageBoxIcon.Exclamation) End Try answerDecimal = Commision_rate_Decimal * (priceDecimal - costDecimal) lblcomission.Text = answerDecimal.ToString("C") End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • locoyama
  • ベストアンサー率77% (7/9)
回答No.4

すみません、補足です Dim rx As New System.Text.RegularExpressions.Regex("[^0-9]", System.Text.RegularExpressions.RegexOptions.Compiled) は、以下のコードをまとめて書いたものです ’宣言 Dim rx As System.Text.RegularExpressions.Regex ’オブジェクトの参照を変数に入れる rx = New System.Text.RegularExpressions.Regex("[^0-9]", System.Text.RegularExpressions.RegexOptions.Compiled) 上記コードの()の中はクラスを初期化する時の引数です(必須ではありません)。 ()の中に有る"[^0-9]"は、正規表現で数値の0~9以外の文字列と言う意味で、 System.Text.RegularExpressions.RegexOptions.Compiled は、正規表現の文字列を起動時にコンパイル(起動には少し時間が掛かるが、実行時は早い)するオプション。

tomydego
質問者

お礼

ありがとうございました。おかげで問題はすべて解決しました。当方、長所新車ですので、これからもなにかありましたら、皆様よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • locoyama
  • ベストアンサー率77% (7/9)
回答No.3

No2へのご回答 Dim price As Integer = 1000 というコードはよく書かれてる事と思いますが、 その意味は、priceと言うInteger型の変数に1000と言う数字を入れていると言う意味ですよね? それとほぼ同じで、変数に入れる対象がオブジェクトになっただけです。 上のコードとNo.2コードを比較すると 変数名 price→rx 型   Integer→Regex 値   1000→New Regex(Regexクラスのオブジェクト) つまりRegexという、正規表現を扱うクラスの オブジェクトへの参照を持つrxと言う変数の定義です。 ちなみにRegexの前に付いているSystem.Text.RegularExpressions と言うのは、Regexと言うクラスがどこの場所に有るか指定してる物です。 ネームスペースSystemの中の ネームスペースTextの中の ネームスペースRegularExpressionsの中の Regexと言うクラスを使いますよって感じです。

全文を見る
すると、全ての回答が全文表示されます。
  • locoyama
  • ベストアンサー率77% (7/9)
回答No.2

やり方が違いますが、正規表現を使った方法です。 ちゃんとテストしていないので、まともに動くか分かりませんが・・・ Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim Commision_rate_Decimal As Decimal = 0.25D '正規表現クラスを使用 Dim rx As New System.Text.RegularExpressions.Regex("[^0-9]", System.Text.RegularExpressions.RegexOptions.Compiled) 'テキストボックスの文字列に数値以外が入っていないか確認 If rx.IsMatch(Me.txtprice.Text) OrElse rx.IsMatch(Me.txtcost.Text) Then MessageBox.Show("You have entered Invalid Data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Else '入っていなかった場合の処理 Try Me.lblcomission.Text = (Commision_rate_Decimal * (Decimal.Parse(Me.txtprice.Text) - Decimal.Parse(Me.txtcost.Text))).ToString("C") Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End If End Sub >このプログラムだとちゃんと正の数字を入れた場合でもエラーのメッセージボックスがでてしまいます・・・。これはなぜなのでしょうか? 以下を試してみてください。 1.何行目でエラーが出てるのかをまず確認 2.例外をキャッチした後のpriceException や costException のメッセージやスタックトレース   の情報を見てなぜ例外が起きるのかを分析する ちなみに、エラーの何でもかんでもtry-catchに任せるのは、プログラム作成上問題が有ります。 予測可能な例外はなるべくプログラム側で吸収しましょう。

tomydego
質問者

お礼

適切なご回答ありがとうございます。 上記のプログラムを当てはめたところ、見事に動きました。 Dim rx As New System.Text.RegularExpressions.Regex("[^0-9]", System.Text.RegularExpressions.RegexOptions.Compiled) このDimはなにを宣言しているのでしょうか? お手数をおかけしますが。解説していただければ幸いです。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

2個目のTryの txtprice.Text = priceDecimal < 0 txtcost.Text = costDecimal < 0 意味がよくわからないのですが、 IFで、マイナスかどうか調べて、エラーメッセージをだせば済むことではないでしょうか?

tomydego
質問者

お礼

そうですね。Ifを使った方が簡潔に正しくできることが発覚しました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB2010で、シリアル通信をするには

    VB2010で、シリアル通信をするには シリアルポートをopenしようとすると、エラーで弾かれてしまいます。 どのように対処したら良いですか? 使っているソースコードは、下記の通り。 Private Sub ButtonRsStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRsStart.Click Try '例外処理のはじまり If SerialPort1.IsOpen = True Then 'ポートはオープン済み MessageBox.Show("すでに" & SerialPort1.PortName & "は接続されています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If SerialPort1.PortName = "COM1" 'オープンするポート名を格納 SerialPort1.Open() 'ポートオープン PORT_STATE.Text = "OPEN" Catch ex As Exception '例外処理 MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub --------------- エラーが発生する場所は、「Catch 」になります。 エラーメッセージは、「ポート 'COM1' へのアクセスが拒否されました。」です。 何が原因なのか、さっぱり分かりません。 ヒントになりそうな解答を頂けないでしょうか?

  • VB2010から外部機器へのシリアル通信によるデー

    VB2010をのserialport機能を用いて,外部機器にデータを送るプログラムを作成しています。 外部機器から送信されてきたデータの受信は問題なくできましたが,PCからの送信がうまく出来ません。 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If TextBox2.Text.Length = 0 Then MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) TextBox2.Focus() Exit Sub End If Try SerialPort1.WriteLine(TextBox2.Text) Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub プログラムは上記のようになります。(microsoftのサンプルそのままです。) 上記のプログラムで 数字の「1」を送信したいのですが,うまく送ることができません。 外部機器は,データが送信されたことは感知していますが, 「1」 が送られたことは認識できていないようです。 serialdebug2というソフトを使用して,「1」 を送信した場合は,問題ありませんでした。 どうすれば,上記のような問題を解決できるdしょうか?

  • PCからPICへのデータ送信について

    VB2010をのserialport機能を用いて,外部機器にデータを送るプログラムを作成しています。 外部機器から送信されてきたデータの受信は問題なくできましたが,PCからの送信がうまく出来ません。 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If TextBox2.Text.Length = 0 Then MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) TextBox2.Focus() Exit Sub End If Try SerialPort1.WriteLine(TextBox2.Text) Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub プログラムは上記のようになります。(microsoftのサンプルそのままです。) 上記のプログラムで 数字の「1」を送信したいのですが,うまく送ることができません。 外部機器は,データが送信されたことは感知していますが, 「1」 が送られたことは認識できていないようです。 serialdebug2というソフトを使用して,「1」 を送信した場合は,問題ありませんでした。  ほかのサイトでも質問させてもらい,VBの文字コードを変換するようにとのアドバイスを頂き,実行しましたが,うまくデータが送信できませんでした。 どうすれば,上記のような問題を解決できるでしょうか?

  • 例外ってIf文の中に入れますか?If文の外でTry...Catchしますか??

    例外ってIf文の中に入れますか?If文の外でTry...Catchしますか?? Sub Cal(By Val Data As String)  If ( Flag = "hoge") Then  Total = js.Eval(Work)  End If End Sub それと、”エラーコードをテキストの説明に変換する”FormatMessage関数を使おうと思っています。 「例外処理 = FormatMessage関数」という図式は古いですか?いまはもっと違う方法ですか?

  • URLの形を決定できないとでますが、どういうことでしょう?

    いくつも質問を出して申し訳ありません。実は、webページを開くフォームを作っているのですが、普通にテキストボックスを作ってその中に直接URLを入れて Try WebBrowser1.Url = New Uri(TextBox1.Text) Catch ex As Exception MessageBox.Show(ex.Message) End Try このように記述すると、WebBrowserにはきちんとweb画面がでます。 ところが、テキストボックスにaccessデータベースのtableから取り出したURLを貼り付けると”URLの形を決定できない”でます。どういうことか分からず困っています。どなたかよろしくお願いいたします。 やりたいことは、accessのデータベースに登録してあるURLを、リストボックスに並べて、ボタンをクリッククリックすると次々と出るというプログラムなのですが。

  • VB2005でで正しい計算結果が出ません。

    VB2005でで正しい計算結果が出ません。 こんにちわ。プログラミング初心者です。どうかよろしくお願いします。 緯度経度を変換する計算式をプログラムしたのですが、計算結果が間違って出力されます。 下にプログラムを書くのでどこがおかしいのか、またどうすれば正しい計算結果が求められるのかを教えてください。お願いします。 ちなみにTextBox22には 3601.4589 、 TextBox23には 13942.9930 のような数字が入っています。 Private Sub seriWork() Dim buffer, buffer2() As String Dim di1, di2, dk1, dk2 As Double '~通信に関するところなので中略します~ '~ここから先が計算です~ 'Dの緯度百分率変換表示 TextBox22.Text = dN di1 = Double.Parse(Mid(TextBox22.Text, 1, 2)) di2 = Double.Parse(Mid(TextBox22.Text, 3, 7)) TextBox14.Text = di1 + (di2 / 60).ToString() 'Dの経度百分率変換表示 TextBox23.Text = dE dk1 = Double.Parse(Mid(TextBox23.Text, 1, 3)) dk2 = Double.Parse(Mid(TextBox23.Text, 4, 7)) TextBox15.Text = dk1 + (dk2 / 60).ToString() Me.Invoke(New ReDelgate(AddressOf completed)) End If Loop Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally If SerialPort1.IsOpen = True Then SerialPort1.Close() End Try End If この計算の意図は、GPSレシーバーから受信される「3601.4589」のような形の座標形式を googl mapで表示できる座標に変換するものです。 たとえば、シリアルポートでGPSから受信した緯度が3601.4589 の場合は、「=36 + (1.4589 / 60)」と計算すると 36.024315 のような形になります。 あと、3601.4589 を 36と1.4589で分割するためにMidを使用しています。 /60は公式です。 上記プログラムだと 62.3333333 のような誤解答が出てきます。 どうか教えてください。お願いします。

  • HTTP接続すると文字化けがおこってしまいます

    VB2005です。 HTTPサーバーに接続してデータをテキストボックスに書き出す処理なのですが、どうしても文字化けしてしまい困っています。どうしたらよいでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' HTTPサーバーへ接続する Dim client As New WebClient Try ' HTTPサーバーへ接続しストリームを取得する Dim stream As System.IO.Stream = _ client.OpenRead(TextBox1.Text) ' テキストボックスへ結果を書き出す Dim reader As New System.IO.StreamReader(stream) TextBox2.Text = reader.ReadToEnd() reader.Close() stream.Close() Catch ex As WebException ' URLが不正の場合は例外が発生する MessageBox.Show(ex.Message) End Try End Sub

  • テキストファイルを保存しきれない

    いつもありがとうございます。 iniファイルを置換して上書き保存するのですが、置換して保存すると保存後のファイルの最後のほうが切れて保存しきれていませんでした。 保存前→100行 保存後→80行 な感じです。コードが悪いんだと思いますが、どなたか教えていただけないでしょうか。 Dim FileObj13 As Object Dim ListFile13 As String Try FileObj13 = New IO.StreamReader(Foldername & "\CUS\UISetup.ini", System.Text.Encoding.Default) ListFile13 = FileObj13.ReadToEnd() FileObj13.Close() Catch ex As Exception MessageBox.Show("指定のファイルが見つかりません", "エラー", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try '置換 ListFile13 = ListFile13.Replace("K", "G") ListFile13 = ListFile13.Replace("C5", "45") 'ファイルを上書きで保存するための指定 Dim writer13 As New System.IO.StreamWriter(Foldername & "\CUSUISetup.ini", False, System.Text.Encoding.Default) writer13.Write(ListFile13) Label2.Text = "完了"

  • 0除算の例外処理ができない!!助けて!!

    0除算の例外処理ができない!!助けて!! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try If (Flag = "数値") Then Flag = "演算子" Work = Total + Calc + Input Total = js.Eval(Work) Input = "" TextBox1.Text = Total End If Catch ex As Exception MessageBox.Show("Exception Error : 0除算を行いました。") End Try ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Total + Calc + Inputは、すべて文字列です。 実行すると、ポップアップではなく、テキストエリアにこんな文字列が・・・ 0除算しても例外が発生しない・・・ 0 / 0 ・・・NaN (非数値) 1 / 0 ・・・+∞ そもそも、0除算ってなんですか??? 0で割っても例外が出ない!!

  • delphi try文の使い方

    下記コードのようにエラーを回避したいのですが、try文が機能せずエラーになります。 procedure TForm1.Button1Click(Sender: TObject); var p:integer; begin edit1.text:='abc'; try p:=strtoint(edit1.Text); except p:=-1; end; label1.Caption:=inttostr(p); end; try文の使い方がわかりません。

このQ&Aのポイント
  • 日々の最初の1枚目のカラー印刷時が綺麗に印刷できず、4~5回クリーニング&ノズルチェックシートを印刷して8割位の印刷色の出来で使用、3~4時間後にまた印刷不具合になり、この2週間でインクカートリッジ全色で15~16本なくなって困ってます
  • パソコンはWindows10、接続は有線LANで使用しています。関連するソフト・アプリはありません。電話回線はひかり回線です。
  • チェックしたいこと:印刷不具合の原因と対策、インクカートリッジの減りが早い原因と対策
回答を見る

専門家に質問してみよう