
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で割っても例外が出ない!!
No.4ベストアンサー
- 回答日時:
・コードが少ない
・変数の型が不明
・変数なのかも不明
・クラスの中身が不明
もっと単純に記述してからクラス化した方がいいのでは?
むしろわかりやすく書かないと的確な答えは返ってこない。
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回押したときぐらいでしょう。。。
ありがとうございます。
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除算できない。。。
No.5
- 回答日時:
>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は(カスタム)となっています。
ソースに直書きが主流なの?!
あ,自分が直書きしているもんだからつい…
ありがとうございます。
そもそも、「0 / 0 = NaN(非数値)」という結果だとなにがダメなんですか?
1 / 0 = +∞ でもいいと思いますけどね。ダメですか?
No.3
- 回答日時:
#最初は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 …
#うまく表現できなくて完璧に愚痴になってます、ごめんなさい
ありがとうございます。
Visual Studio 2005のVisual Basicです。
教えて!goo > [技術者向] コンピューター > プログラミング > Visual Basic
に投稿したので、VBが前提かと思ってました・・・
教えて!gooじゃないとこはカテゴリが表示されない???
jsの型は、MSScriptControl.ScriptControlです。
中身はString型しか入ってきません。
Microsoft.JScriptではなく、Microsoft Script Control 1.0です。
No.2
- 回答日時:
ちなみに,/演算子は浮動小数点数の除算を行います。
整数除算には,\演算子を使います。
0割りを調べたいなら,CatchするのはDivideByZeroExceptionのみにしましょう。
このコードだと,InvalidCastExceptionでも0除算だと表示されます。
ありがとうございます。
InvalidCastException・・・初めて聞いた言葉です
型が違うってことは、ボタンを押して操作する電卓なので起こらないと思います。
浮動小数点の除算なので/演算子で良いと思います。
いろいろなExceptionがあることを知りました。
No.1
- 回答日時:
IEEE 754の規格で浮動小数点数同士の除算では,例外が発生せず,そういう挙動をすると書かれているらしい。(つまり仕様)
整数同士の演算では例外は発生します。
#Option Explicit OnもOption Strict Onもないコードなんか嫌いだ。
ありがとうございます。
参考サイト見させていただきました。
Exceptionっていくつもあって、複数書かないとキャッチできないってことですか。
Exceptionを書けば、全部キャッチしてくれると思ってました。
>整数同士の演算では例外は発生します。
言ってる意味がわかりません。
>Option Explicit OnもOption Strict Onもないコードなんか嫌いだ。
Visual Studio 2005を使っていて、プロジェクトは初期設定のままで、
Option ExplicitはOnで、Option Strictは(カスタム)となっています。
ソースに直書きが主流なの?!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Excel(エクセル) excel2013 色付きセルの値合計 3 2023/02/28 11:48
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VBA Evaluate関数 型が一致しま...
-
Javaの例外 IllegalArgumentExc...
-
0除算の例外処理ができない!!...
-
全角スペースのチェックについて
-
Javaで文字列をゼロ埋め(ゼロパ...
-
C#の捕捉されない例外処理の対...
-
ブックマークレットについて
-
java 文字列の部分一致について
-
C# UriFormatExceptionの回避
-
VBA 400エラー 1004エラー
-
連続する「\\」をひとつの「\\...
-
タトゥーや墨を入れる人の共通点
-
時間の取得
-
【JSPがブラウザで表示されませ...
-
エクセルVBAで、条件に一致する...
-
C# インスタンスの破棄
-
クラスのプロパティに構造体を...
-
MFCで水平スクロールバー
-
エクセルVBA 画像を貼り付ける...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
C#の捕捉されない例外処理の対...
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
VC++におけるCStringの変換
-
VBA Evaluate関数 型が一致しま...
-
Javaで文字列をゼロ埋め(ゼロパ...
-
ファイルダイアログを開いた時...
-
VB.NETで16進数が正しいかどう...
-
Timestamp型への変換について(J...
-
C# マルチスレッドにおける例外...
-
コンストラクタでの例外は不可...
-
文字列からダブルクオートの削除
-
String型の日付(2005/11/25)の...
-
例外ってIf文の中に入れますか...
-
初回例外
-
【JAVA】与えられた金額を貨幣...
-
アサーションと例外処理の違い...
-
VBA 400エラー 1004エラー
-
WebClient()以外でネットにアク...
おすすめ情報