dポイントプレゼントキャンペーン実施中!

(1/2)

文末のように、よくある(1) 和暦→西暦、(2) 西暦→和暦 変換スクリプトで、

nullだったり半角数字だったりした場合のエラー処理として、
(1) は、次のようにしたらOKでした。

try{
alert("西暦"+wareki+"年");
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}



しかし、(2) は同様に次のようにしても、nullや半角英字だったりすると
スクリプトエラーになってしまいます(例外処理されない)

try{
alert(seireki1+seireki+"年");
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}

どこに誤りがあるのでしょうか?よろしくお願い致します。

A 回答 (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 {
//処理
}
と素直に書いた方が良いような気がします。
(もともとの質問文の意図とは異なるものになってしまうので、今までは書きませんでしたが)
    • good
    • 0
この回答へのお礼

BLUEPIXYさん、いつもお世話になります。

試してみたところ、「西暦NaN年」になるってわけですね。
スクリプトエラーにならないだけでも本当に(精神衛生上)嬉しいです。

とりあえずご教示の方法でしばらく運用してみます。
本当にありがとうございました。

お礼日時:2005/02/16 22:13

#5でparseInt("123D")とかの場合はエラーにはならずに123になってしまうようです。


これもチェックするには、求めた数値をもう一度文字列にして同じかどうかとかチェックする必要があります。
    • good
    • 0

>どこと入れ替えたら


wareki = myform.wareki.value;

try{
wareki=eval(myform.wareki.value);
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}

エラーの時は、下に抜けないようにしないとダメかも。
seirekiも同様ですね。

この回答への補足

BLUEPIXYさん、たびたびのご教示ありがとうございます。

早速入れ替えてみましたが
alert( "エラーです。入力した値を確認して下さい。" );
が表示された「後で」スクリプトエラーが起こります。
(warekiが宣言されていない、と)

これがおっしゃる、
> エラーの時は、下に抜けないようにしないとダメかも。

ということでしょうか??

補足日時:2005/02/15 09:04
    • good
    • 0

(2)の場合、「seireki1」が宣言されていないからでしょう。


「seireki1」という変数は、西暦の年数を範囲チェックする
if文の条件のいずれかにヒットしたときは宣言されていますが
どの条件にも該当しなかったときは、宣言処理を通りません。
(1)の方は、かならずwarekiの宣言を通っていますし、
switchのdefaultによって、どこにも該当しない場合の
対処があります。

この回答への補足

osumitanさん、アドバイスありがとうございます。
状況についてはよく理解できました。
(2) の方もswitchにすることはできないので(^^:
ちょっと途方に暮れているのですが。。。

でも勉強になりました。ありがとうございます。

補足日時:2005/02/14 23:38
    • good
    • 0

質問文の例の場合、例外は起こらないです。



#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( "エラーです。入力した値を確認して下さい。" );
}

ほんとすみませんがアドバイスいただけますと幸いです。

補足日時:2005/02/14 23:29
    • good
    • 0

すみません、質問者です。

ソースは下記です。

<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>
    • good
    • 0

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