Skip to content

Commit b7ceb4e

Browse files
author
Thomas Grainger
committed
Add traceback to unhandled promise rejections, Fixes: angular#14631
1 parent 4e143fc commit b7ceb4e

File tree

2 files changed

+44
-32
lines changed

2 files changed

+44
-32
lines changed

src/ng/q.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,11 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
381381
if (!toCheck.pur) {
382382
toCheck.pur = true;
383383
var errorMessage = 'Possibly unhandled rejection: ' + toDebugString(toCheck.value);
384-
exceptionHandler(errorMessage);
384+
if (toCheck.value instanceof Error) {
385+
exceptionHandler(toCheck.value, errorMessage);
386+
} else {
387+
exceptionHandler(errorMessage);
388+
}
385389
}
386390
}
387391
}

test/ng/qSpec.js

+39-31
Original file line numberDiff line numberDiff line change
@@ -2167,45 +2167,53 @@ describe('q', function() {
21672167

21682168

21692169
describe('when exceptionHandler is called', function() {
2170-
it('should log an unhandled rejected promise', function() {
2171-
var defer = q.defer();
2172-
defer.reject('foo');
2173-
mockNextTick.flush();
2174-
expect(exceptionHandlerStr()).toBe('Possibly unhandled rejection: foo');
2175-
});
2170+
var fixtures = [
2171+
{ type: 'exception', value: new Error('Fail') },
2172+
{ type: 'plain value', value: 'foo' }
2173+
];
2174+
forEach(fixtures, function(fixture) {
2175+
var type = fixture.type;
2176+
var value = fixture.value;
2177+
it('should log an unhandled' + type + ' rejected promise', function() {
2178+
var defer = q.defer();
2179+
defer.reject(value);
2180+
mockNextTick.flush();
2181+
expect(exceptionHandlerStr()).toBe('Possibly unhandled rejection: foo');
2182+
});
21762183

21772184

2178-
it('should not log an unhandled rejected promise if disabled', function() {
2179-
var defer = q_no_error.defer();
2180-
defer.reject('foo');
2181-
expect(exceptionHandlerStr()).toBe('');
2182-
});
2185+
it('should not log an unhandled' + type + ' rejected promise if disabled', function() {
2186+
var defer = q_no_error.defer();
2187+
defer.reject(value);
2188+
expect(exceptionHandlerStr()).toBe('');
2189+
});
21832190

21842191

2185-
it('should log a handled rejected promise on a promise without rejection callbacks', function() {
2186-
var defer = q.defer();
2187-
defer.promise.then(noop);
2188-
defer.reject('foo');
2189-
mockNextTick.flush();
2190-
expect(exceptionHandlerStr()).toBe('Possibly unhandled rejection: foo');
2191-
});
2192+
it('should log a handled' + type + ' rejected promise on a promise without rejection callbacks', function() {
2193+
var defer = q.defer();
2194+
defer.promise.then(noop);
2195+
defer.reject(value);
2196+
mockNextTick.flush();
2197+
expect(exceptionHandlerStr()).toBe('Possibly unhandled rejection: foo');
2198+
});
21922199

21932200

2194-
it('should not log a handled rejected promise', function() {
2195-
var defer = q.defer();
2196-
defer.promise.catch(noop);
2197-
defer.reject('foo');
2198-
mockNextTick.flush();
2199-
expect(exceptionHandlerStr()).toBe('');
2200-
});
2201+
it('should not log a handled' + type + 'rejected promise', function() {
2202+
var defer = q.defer();
2203+
defer.promise.catch(noop);
2204+
defer.reject(value);
2205+
mockNextTick.flush();
2206+
expect(exceptionHandlerStr()).toBe('');
2207+
});
22012208

22022209

2203-
it('should not log a handled rejected promise that is handled in a future tick', function() {
2204-
var defer = q.defer();
2205-
defer.promise.catch(noop);
2206-
defer.resolve(q.reject('foo'));
2207-
mockNextTick.flush();
2208-
expect(exceptionHandlerStr()).toBe('');
2210+
it('should not log a handled' + type + ' rejected promise that is handled in a future tick', function() {
2211+
var defer = q.defer();
2212+
defer.promise.catch(noop);
2213+
defer.resolve(q.reject(value));
2214+
mockNextTick.flush();
2215+
expect(exceptionHandlerStr()).toBe('');
2216+
});
22092217
});
22102218
});
22112219
});

0 commit comments

Comments
 (0)