読者です 読者をやめる 読者になる 読者になる

lessのエラーハンドリング

node.js
function foo() {
  var e = { name: 'Error', message: 'hoge' };
  throw e;
}

foo();

node.jsでこれ実行すると

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: hoge

こうなるわけなんだけど、エラーの箇所がさっぱりわからんので

function bar() {
  var e = Error('hoge');
  throw e;
}

bar();

こうしていただくと、まだこっちのほうがわかりやすかったりする。

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: hoge
    at Error (unknown source)
    at bar (/Users/hokamura/tmp/err/test.js:2:11)
    at Object.<anonymous> (/Users/hokamura/tmp/err/test.js:6:1)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)
    at EventEmitter._tickCallback (node.js:192:40

lessでそうなってる。
https://github.com/cloudhead/less.js/blob/9eb0423cb2428bb166c962f1362ac727f1d92c7d/lib/less/parser.js#L260-264
しかもこれコールバックを受け取る関数なのにthrowしてるのでさらにやっかいですね:)

その下のこっちのエラーはちゃんとcallbackにわたっているのに。。
https://github.com/cloudhead/less.js/blob/9eb0423cb2428bb166c962f1362ac727f1d92c7d/lib/less/parser.js#L367-379

というか書いてて気づいたけど、そもそもこの関数非同期じゃないぞ。。