- ベストアンサー
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で割っても例外が出ない!!
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
・コードが少ない ・変数の型が不明 ・変数なのかも不明 ・クラスの中身が不明 もっと単純に記述してからクラス化した方がいいのでは? むしろわかりやすく書かないと的確な答えは返ってこない。 Exceptionでは0除算のエラーは拾えません。 だからCatchできないのです。 -------------------------------------------------------------- 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("システムエラーが発生しました。") Catch Zero_ex As DivideByZeroException MessageBox.Show("Exception Error : 0除算を行いました。") End Try -------------------------------------------------------------- ■Exceptionとは http://msdn.microsoft.com/ja-jp/library/system.exception%28VS.80%29.aspx ■ゼロ除算の回避方法 http://blog.livedoor.jp/akf0/archives/51073757.html
その他の回答 (5)
- himajin100000
- ベストアンサー率54% (1660/3060)
>#例外を投げないんだから キャッチもできない #自分は書きながら思考が飛ぶことがあります。
お礼
ありがとうございます。 このままだと例外処理がないプログラムで完結しそうです。
- himajin100000
- ベストアンサー率54% (1660/3060)
>Exceptionっていくつもあって、複数書かないとキャッチできないってことですか。 >Exceptionを書けば、全部キャッチしてくれると思ってました。 投げた奴はキャッチできるけど,そもそも投げないらしい(俺にとっても意外だった。) まず,Script Controlは置いておいて, ================================================ Option Strict On Option Compare Binary Option Infer Off Class Program Shared Sub Main() Dim x As Double = 1.0 Dim y As Double = 0.0 try System.Diagnostics.Debug.Print((x / y).ToString()) catch e As System.DivideByZeroException System.Diagnostics.Debug.Print("error 1") end try Dim a As Integer = 1 Dim b As Integer = 0 try System.Diagnostics.Debug.Print((a \ b).ToString()) catch e As System.DivideByZeroException System.Diagnostics.Debug.Print("error 2") end try End Sub End Class これのアウトプットウィンドウへの出力結果は +∞ error 2 となります (Double型の場合,例外自体が発生しないからerror 1のルートを通らない。 多分上をSingle型にしたり,下をLong型にしたりしても同じ出力になるでしょう。) http://msdn.microsoft.com/en-us/library/25bswc76%28VS.80%29.aspx #説明によると戻り値を特定の型の変数で受けようとすると挙動が変わることがあるようだ。 なお,\演算子は演算子オーバーロードによって各引数がLongでないものも取れますが,そのときはLongに丸めます。 \演算子の除数が計算されたとき0と等しくなった場合は,どんなときでもDivideByZeroExceptionを発生させるそうです。 http://msdn.microsoft.com/en-us/library/0e16fywh%28VS.80%29.aspx ちなみにC#の場合は,この二つの演算がどちらも/演算子によって行われる class hoge{ public static void Main(){ try{ System.Console.WriteLine(1 / 0); }catch(System.DivideByZeroException e){ // 発生する } try{ System.Console.WriteLine(1.0 / 0.0); }catch(System.DivideByZeroException e){ // 発生しない } } } ====================================================== >VBが前提かと思ってました・・・ Microsoft Script ControlがEvalする文字列が(VB.NETではなく)VBScript,JScript等になっている,というつもりで言った。 C#と勘違いしているのは俺がボケていただけ。 確認はしていませんが,おそらくDoubleやSingleの時,例外を投げない挙動はVBScriptでもJScriptでも同じなんじゃないかなーと思っている。 #例外を投げないんだから それとは別の議論として(メイン) VBScriptやJScript内で例外が出たときにVB.NETの例外としてちゃんと捕捉できるのかが自信ない…多分無理だろうなと思っているんだ。 ======================================================= >Visual Studio 2005を使っていて、プロジェクトは初期設定のままで、 Option ExplicitはOnで、Option Strictは(カスタム)となっています。 ソースに直書きが主流なの?! あ,自分が直書きしているもんだからつい…
お礼
ありがとうございます。 そもそも、「0 / 0 = NaN(非数値)」という結果だとなにがダメなんですか? 1 / 0 = +∞ でもいいと思いますけどね。ダメですか?
- himajin100000
- ベストアンサー率54% (1660/3060)
#最初はC#だと思って勘違いをし,次にVB.NETだと勘違いした。 >Yune-Kichiさん 変数jsの型が明示されてないから,回答としては「知らん」で突き放しても俺はOKだというスタンスだ…が,今回は置いておく。 掲示の式の評価はEcmascriptだから\演算子がそもそもないよ(C#だと思って,整数演算用の演算があると勘違いしている俺の記述も誤り。IEEE 754のくだりは間違っているとは思わない)…っていおうとしたんだけどなあ。 Microsoft.JScript.EvalのJScriptEvaluateとも思ったんだけど。Evalメソッドはないね、このクラスなんだろう… http://msdn.microsoft.com/en-us/library/microsoft.jscript.eval_members.aspx http://msdn.microsoft.com/en-us/library/cw8bx66y%28VS.80%29.aspx #うまく表現できなくて完璧に愚痴になってます、ごめんなさい
お礼
ありがとうございます。 Visual Studio 2005のVisual Basicです。 教えて!goo > [技術者向] コンピューター > プログラミング > Visual Basic に投稿したので、VBが前提かと思ってました・・・ 教えて!gooじゃないとこはカテゴリが表示されない??? jsの型は、MSScriptControl.ScriptControlです。 中身はString型しか入ってきません。 Microsoft.JScriptではなく、Microsoft Script Control 1.0です。
- Yune-Kichi
- ベストアンサー率74% (465/626)
ちなみに,/演算子は浮動小数点数の除算を行います。 整数除算には,\演算子を使います。 0割りを調べたいなら,CatchするのはDivideByZeroExceptionのみにしましょう。 このコードだと,InvalidCastExceptionでも0除算だと表示されます。
お礼
ありがとうございます。 InvalidCastException・・・初めて聞いた言葉です 型が違うってことは、ボタンを押して操作する電卓なので起こらないと思います。 浮動小数点の除算なので/演算子で良いと思います。 いろいろなExceptionがあることを知りました。
- himajin100000
- ベストアンサー率54% (1660/3060)
http://msdn.microsoft.com/en-us/library/system.dividebyzeroexception.aspx IEEE 754の規格で浮動小数点数同士の除算では,例外が発生せず,そういう挙動をすると書かれているらしい。(つまり仕様) 整数同士の演算では例外は発生します。 #Option Explicit OnもOption Strict Onもないコードなんか嫌いだ。
お礼
ありがとうございます。 参考サイト見させていただきました。 Exceptionっていくつもあって、複数書かないとキャッチできないってことですか。 Exceptionを書けば、全部キャッチしてくれると思ってました。 >整数同士の演算では例外は発生します。 言ってる意味がわかりません。 >Option Explicit OnもOption Strict Onもないコードなんか嫌いだ。 Visual Studio 2005を使っていて、プロジェクトは初期設定のままで、 Option ExplicitはOnで、Option Strictは(カスタム)となっています。 ソースに直書きが主流なの?!
お礼
ありがとうございます。 jsの型は、MSScriptControl.ScriptControlです。 Microsoft.JScriptではなく、Microsoft Script Control 1.0を使っています。 クラスの中身はString型しか入ってきません。 >Exceptionでは0除算のエラーは拾えません。 驚愕の事実です。 >'System.DivideZeroException'は、'System.Exception'から継承するため、'Catch'ブロックは到達しませんでした。 順番を入れ替えたら、エラーが消えました。 Exceptionが大元?まとめ役? Catch Zero_ex As DivideByZeroException MessageBox.Show("Exception Error : 0除算を行いました。") Catch ex As Exception MessageBox.Show("システムエラーが発生しました。") 入れる前: 0 / 1 = 0 0 / 0 = NaN(非数値) Catch Zero_ex As DivideByZeroExceptionを追加: 0 / 1 = 0 0 / 0 = NaN(非数値) 0除算エラー出ない・・・ Exceptionのキャッチを消して、Catch Zero_ex As DivideByZeroExceptionだけにしてみた: 0 / 1 = 0 0 / 0 = NaN(非数値) できない!!!1日掛って0除算できない。。。
補足
本当にTry...Catchが出来ているか? 数字ボタンにあえて、Aボタンというのを作ってみました。 速効で、エラーメッセージが出ました。当たり前ですね・・・ Aボタンは消したので、0除算エラーではなく、 エラーが出るとしたら、.←小数点ボタンを2、3回押したときぐらいでしょう。。。