アタシ ポンコツ システムエンジニア

新卒ポンコツSEの成長を描く(予定の)感動のスペクタクル超大作

【javascript】parseIntをtry-catchで囲んでもパースエラーをキャッチしてくれない

概要

先日Node.jsを使っていて、
GETで受け取ったパラメータのチェックをするコードを書いた際に、
Javaの経験から、何となくtry-catchで囲っとけばパース出来ないパラメータが飛んできても大丈夫かなと思っていたのですが、
上手くいかなかったので調べたことをメモしておきます。

parseIntに文字列を食わせてみる

自分の手元で最初に以下のようなコードを書きました。

try{
    id = parseInt(reqParam, 10);
}catch(err){
    logger.error(err);  //←ここに来てくれない
    reqError = true;
}

javaだと上みたいな書き方をすると「ParseException」という例外がスローされてキャッチに入るのですが、
javascriptだとキャッチされませんでした。

少しコードを追ってみるとidにNaN(非数)という値が入ってました。

javascriptのパースエラーはisNaN()とisFinite()を使おう

もう少し調べてみると、似たような問題に突き当たってる人を見つけました。
stackoverflow.com

どうやらjavascriptではisNaN(), isFinite()という二つの関数を使って、
パースエラーを検出するのが正しい作法なようです。

isNaN() - JavaScript | MDN
isFinite() - JavaScript | MDN

感想

Node.jsのサンプルコードを見ていると稀にtry-catchが使われているのを見るので、
javaのように使っていいのかなと思うと、そうでない場面に度々出会います。。

今のところNode.jsではtry-catchは自身でエラーハンドリングを考えて
ガッツリ組むとき以外は使わないっていう認識で良いんですかね??

まぁjavascript自体、日々作法が変わっていっているので何が正しいかわかりませんが…