- ベストアンサー
例外処理(try...catch...)ができない?
(1/2) 文末のように、よくある(1) 和暦→西暦、(2) 西暦→和暦 変換スクリプトで、 nullだったり半角数字だったりした場合のエラー処理として、 (1) は、次のようにしたらOKでした。 try{ alert("西暦"+wareki+"年"); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } しかし、(2) は同様に次のようにしても、nullや半角英字だったりすると スクリプトエラーになってしまいます(例外処理されない) try{ alert(seireki1+seireki+"年"); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } どこに誤りがあるのでしょうか?よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>ということでしょうか?? そうです。 try{ wareki=eval(myform.wareki.value); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } のtryでwarekiの実体ができているので それが失敗したら、warekiがないということになりますよね。 1つには、こういうことに関係なく var wareki; で宣言しておくことですが、 宣言されていないというエラーにはならなくても、 値が無意味な値nullとか0になるので、 これもおかしいですね。 エラーが起こるということは、その変数の値が無効(というかそれを調べたかったのだから)なのだから、それを用いた計算はすべきではありませんよね。 結局の処、エラーが起こったことを何らかの変数に記録して、ifでくくるようなことになるのかもしれませんが、そんな風にやるくらいなら var wareki=parseInt(myform.wareki.value); if(wareki==NaN){//数値ではない alert("エラーです。入力した値を確認して下さい。"); } else { //処理 } と素直に書いた方が良いような気がします。 (もともとの質問文の意図とは異なるものになってしまうので、今までは書きませんでしたが)
その他の回答 (5)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#5でparseInt("123D")とかの場合はエラーにはならずに123になってしまうようです。 これもチェックするには、求めた数値をもう一度文字列にして同じかどうかとかチェックする必要があります。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>どこと入れ替えたら wareki = myform.wareki.value; を try{ wareki=eval(myform.wareki.value); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } に エラーの時は、下に抜けないようにしないとダメかも。 seirekiも同様ですね。
補足
BLUEPIXYさん、たびたびのご教示ありがとうございます。 早速入れ替えてみましたが alert( "エラーです。入力した値を確認して下さい。" ); が表示された「後で」スクリプトエラーが起こります。 (warekiが宣言されていない、と) これがおっしゃる、 > エラーの時は、下に抜けないようにしないとダメかも。 ということでしょうか??
- osumitan
- ベストアンサー率33% (102/307)
(2)の場合、「seireki1」が宣言されていないからでしょう。 「seireki1」という変数は、西暦の年数を範囲チェックする if文の条件のいずれかにヒットしたときは宣言されていますが どの条件にも該当しなかったときは、宣言処理を通りません。 (1)の方は、かならずwarekiの宣言を通っていますし、 switchのdefaultによって、どこにも該当しない場合の 対処があります。
補足
osumitanさん、アドバイスありがとうございます。 状況についてはよく理解できました。 (2) の方もswitchにすることはできないので(^^: ちょっと途方に暮れているのですが。。。 でも勉強になりました。ありがとうございます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
質問文の例の場合、例外は起こらないです。 #1のプログラムで、 西暦に変換する部分で eval時に eval ( wareki+"+ 1988"); はエラーを起こしますが 和暦に変換する部分では、 西暦の時と違ってifの条件ではじかれてしまうので eval時のエラーにはならないです。 多分そういうことかと思います。 入力が数字に評価できないようなものというのをチェックするためには、このプログラムのように計算に含めないで try{ wareki=eval(myform.wareki.value); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } の様にやるといいと思います。
補足
BLUEPIXYさん、いつもお世話になっております。 恥ずかしいことを聞いて恐縮ですが、 ご教示の下記の部分はどこと入れ替えたら よろしいでしょうか?? try{ wareki=eval(myform.wareki.value); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } ほんとすみませんがアドバイスいただけますと幸いです。
すみません、質問者です。ソースは下記です。 <html><head> <SCRIPT LANGUAGE="JavaScript"> <!-- function myCalc(myform) { if(myform.Radio[0].checked) { myselect = myform.select1.selectedIndex; wareki = myform.wareki.value; switch(myselect) { case 0: wareki = eval ( wareki+"+ 1988"); break; case 1: wareki = eval ( wareki+"+ 1925"); break; case 2: wareki = eval ( wareki+"+ 1911"); break; case 3: wareki = eval ( wareki+"+ 1867"); break; default: wareki = "エラー"; break; } alert("西暦"+wareki+"年"); } if(myform.Radio[1].checked) { seireki = myform.seireki.value; if (seireki>=1989) { seireki = eval ( seireki+ "-1988" ); seireki1= new String( "平成" ); } if (seireki>=1925) { seireki = eval (seireki+"-1925"); seireki1=new String("昭和"); } if (seireki>=1911) { seireki = eval (seireki+"-1911"); seireki1=new String("大正"); } if (seireki>=1867) { seireki = eval (seireki+"-1867"); seireki1=new String("明治"); } alert(seireki1+seireki+"年"); } } //--> </script> </head> <body> <form method="post" id="form3"> <input type="radio" name="Radio" value="ws" id="rdo1" checked> 和暦→西暦 <select name="select1" id="select1"> <option value="heisei">平成</option> <option value="syowa">昭和</option> <option value="taisyo">大正</option> <option value="meiji">明治</option> </select> <input name="wareki" type="text" id="wareki">年 / <input type="radio" name="Radio" value="sw" id="rdo2">和暦←西暦 <input name="seireki" type="text" id="seireki"> 年<br> <input type="button" name="Submit" value=" 変換 " onClick="myCalc(this.form)"> </form> </body></html>
お礼
BLUEPIXYさん、いつもお世話になります。 試してみたところ、「西暦NaN年」になるってわけですね。 スクリプトエラーにならないだけでも本当に(精神衛生上)嬉しいです。 とりあえずご教示の方法でしばらく運用してみます。 本当にありがとうございました。