プロが教えるわが家の防犯対策術!

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で割っても例外が出ない!!

A 回答 (6件)

http://msdn.microsoft.com/en-us/library/system.d …

IEEE 754の規格で浮動小数点数同士の除算では,例外が発生せず,そういう挙動をすると書かれているらしい。(つまり仕様)

整数同士の演算では例外は発生します。

#Option Explicit OnもOption Strict Onもないコードなんか嫌いだ。
    • good
    • 0
この回答へのお礼

ありがとうございます。

参考サイト見させていただきました。

Exceptionっていくつもあって、複数書かないとキャッチできないってことですか。

Exceptionを書けば、全部キャッチしてくれると思ってました。



>整数同士の演算では例外は発生します。

言ってる意味がわかりません。

>Option Explicit OnもOption Strict Onもないコードなんか嫌いだ。

Visual Studio 2005を使っていて、プロジェクトは初期設定のままで、
Option ExplicitはOnで、Option Strictは(カスタム)となっています。
ソースに直書きが主流なの?!

お礼日時:2009/07/17 17:59

ちなみに,/演算子は浮動小数点数の除算を行います。


整数除算には,\演算子を使います。

0割りを調べたいなら,CatchするのはDivideByZeroExceptionのみにしましょう。
このコードだと,InvalidCastExceptionでも0除算だと表示されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

InvalidCastException・・・初めて聞いた言葉です

型が違うってことは、ボタンを押して操作する電卓なので起こらないと思います。
浮動小数点の除算なので/演算子で良いと思います。

いろいろなExceptionがあることを知りました。

お礼日時:2009/07/17 18:08

#最初はC#だと思って勘違いをし,次にVB.NETだと勘違いした。



>Yune-Kichiさん

変数jsの型が明示されてないから,回答としては「知らん」で突き放しても俺はOKだというスタンスだ…が,今回は置いておく。

掲示の式の評価はEcmascriptだから\演算子がそもそもないよ(C#だと思って,整数演算用の演算があると勘違いしている俺の記述も誤り。IEEE 754のくだりは間違っているとは思わない)…っていおうとしたんだけどなあ。

Microsoft.JScript.EvalのJScriptEvaluateとも思ったんだけど。Evalメソッドはないね、このクラスなんだろう…

http://msdn.microsoft.com/en-us/library/microsof …
http://msdn.microsoft.com/en-us/library/cw8bx66y …

#うまく表現できなくて完璧に愚痴になってます、ごめんなさい
    • good
    • 0
この回答へのお礼

ありがとうございます。

Visual Studio 2005のVisual Basicです。

教えて!goo > [技術者向] コンピューター > プログラミング > Visual Basic
に投稿したので、VBが前提かと思ってました・・・

教えて!gooじゃないとこはカテゴリが表示されない???

jsの型は、MSScriptControl.ScriptControlです。
中身はString型しか入ってきません。

Microsoft.JScriptではなく、Microsoft Script Control 1.0です。

お礼日時:2009/07/17 18:14

・コードが少ない


・変数の型が不明
・変数なのかも不明
・クラスの中身が不明

もっと単純に記述してからクラス化した方がいいのでは?
むしろわかりやすく書かないと的確な答えは返ってこない。

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.e …

■ゼロ除算の回避方法
http://blog.livedoor.jp/akf0/archives/51073757.h …

この回答への補足

本当にTry...Catchが出来ているか?
数字ボタンにあえて、Aボタンというのを作ってみました。
速効で、エラーメッセージが出ました。当たり前ですね・・・

Aボタンは消したので、0除算エラーではなく、
エラーが出るとしたら、.←小数点ボタンを2、3回押したときぐらいでしょう。。。

補足日時:2009/07/17 18:34
    • good
    • 0
この回答へのお礼

ありがとうございます。

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除算できない。。。

お礼日時:2009/07/17 18:30

>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 …

#説明によると戻り値を特定の型の変数で受けようとすると挙動が変わることがあるようだ。

なお,\演算子は演算子オーバーロードによって各引数がLongでないものも取れますが,そのときはLongに丸めます。
\演算子の除数が計算されたとき0と等しくなった場合は,どんなときでもDivideByZeroExceptionを発生させるそうです。

http://msdn.microsoft.com/en-us/library/0e16fywh …

ちなみに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は(カスタム)となっています。
ソースに直書きが主流なの?!

あ,自分が直書きしているもんだからつい…
    • good
    • 0
この回答へのお礼

ありがとうございます。

そもそも、「0 / 0 = NaN(非数値)」という結果だとなにがダメなんですか?

1 / 0 = +∞ でもいいと思いますけどね。ダメですか?

お礼日時:2009/07/18 13:37

>#例外を投げないんだから


キャッチもできない

#自分は書きながら思考が飛ぶことがあります。
    • good
    • 0
この回答へのお礼

ありがとうございます。

このままだと例外処理がないプログラムで完結しそうです。

お礼日時:2009/07/18 13:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています