node.jsでコードを書いていると例外が出た時にコールバックにエラーを渡して呼び出し元に処理を任せるということがよくあります。
# 呼び出した関数
@error1:(val,cb)->
console.log 'start'
if val
cb new Error('error Test')
cb null,'ok'
console.log 'end'
# 呼び出し元
ReturnTest.error1 1, (err,result)->
if err
console.log 'Error'
else
console.log result
しかしこの書き方では以下の結果になります。
start
Error
ok
end
コールバックを返した後もerror1メソッドの処理は続いてしまうので、console.log 'end'
まで処理されてしまいます。
ポイントは
- Errorオブジェクトをthrowすれば処理は止まる
- コールバックにErrorオブジェクトを渡しても処理は止まらない
ということです。
new Error()してもthrowしているわけじゃないので止まりません。
正解はこちらです。
@error2:(val,cb)->
console.log 'start'
if val
return cb new Error('error Test')
cb null,'ok'
console.log 'end'
もしくは
@error2:(val,cb)->
console.log 'start'
if val
cb new Error('error Test')
return
cb null,'ok'
console.log 'end'
明示的にreturnして関数内の処理を終えなければいけません。
ちなみに一行ifはこんな感じ。
@error3:(val,cb)->
console.log 'start'
return cb new Error('error Test') if val
cb null,'ok'
console.log 'end'
コールバック関数をラップしてコールバック関数を作る場合も多いと思いますので、スニペットを作っておくと便利です。
以下はatomの場合です。
atomメニュー -> Open Your Snippetsから編集できます。
'.source.coffee':
'throw err if err':
'prefix': 'errt'
'body': 'throw err if err'
'cb err if err':
'prefix': 'errc'
'body': 'return cb err if err'