diff --git a/lib/_debugger.js b/lib/_debugger.js index 7203278b33..00de2b1e70 100644 --- a/lib/_debugger.js +++ b/lib/_debugger.js @@ -236,6 +236,10 @@ Client.prototype._onResponse = function(res) { this.emit('break', res.body); handled = true; + } else if (res.body && res.body.event == 'exception') { + this.emit('exception', res.body); + handled = true; + } else if (res.body && res.body.event == 'afterCompile') { this._addHandle(res.body.body.script); handled = true; @@ -409,6 +413,16 @@ Client.prototype.reqBacktrace = function(cb) { }; +// reqSetExceptionBreak(type, cb) +// TODO: from, to, bottom +Client.prototype.reqSetExceptionBreak = function(type, cb) { + this.req({ + command: 'setexceptionbreak', + arguments: { type: type, enabled: true } + }, cb); +}; + + // Returns an array of objects like this: // // { handle: 11, @@ -495,7 +509,7 @@ Client.prototype.mirrorObject = function(handle, depth, cb) { var val; - if (handle.type == 'object') { + if (handle.type === 'object') { // The handle looks something like this: // { handle: 8, // type: 'object', @@ -695,7 +709,7 @@ function SourceUnderline(sourceText, position, tty) { function SourceInfo(body) { - var result = 'break in '; + var result = body.exception ? 'exception in ' : 'break in '; if (body.script) { if (body.script.name) { @@ -715,6 +729,8 @@ function SourceInfo(body) { result += ':'; result += body.sourceLine + 1; + if (body.exception) result += '\n' + body.exception.text; + return result; } @@ -1599,9 +1615,11 @@ Interface.prototype.trySpawn = function(cb) { self.setBreakpoint(bp.scriptId, bp.line, bp.condition, true); }); - if (cb) cb(); - - self.resume(); + // Break on exceptions + client.reqSetExceptionBreak('all', function(err, res) { + cb && cb(); + self.resume(); + }); client.on('close', function() { self.pause(); @@ -1622,6 +1640,10 @@ Interface.prototype.trySpawn = function(cb) { self.handleBreak(res.body); }); + client.on('exception', function(res) { + self.handleBreak(res.body); + }); + client.on('error', connectError); function connectError() { // If it's failed to connect 4 times then don't catch the next error