Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Apr 12, 2024. It is now read-only.
/angular.jsPublic archive

Commitd73fdde

Browse files
author
Thomas Grainger
committed
fix($q): Add traceback to unhandled promise rejections
Fixes:#14631
1 parentf768da2 commitd73fdde

File tree

2 files changed

+95
-40
lines changed

2 files changed

+95
-40
lines changed

‎src/ng/q.js

Lines changed: 5 additions & 1 deletion
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
varerrorMessage='Possibly unhandled rejection: '+toDebugString(toCheck.value);
384-
exceptionHandler(errorMessage);
384+
if(toCheck.valueinstanceofError){
385+
exceptionHandler(toCheck.value,errorMessage);
386+
}else{
387+
exceptionHandler(errorMessage);
388+
}
385389
}
386390
}
387391
}

‎test/ng/qSpec.js

Lines changed: 90 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,14 @@ describe('q', function() {
181181
};
182182

183183

184-
functionexceptionHandler(reason){
185-
exceptionHandlerCalls.push(reason);
186-
}
187-
188-
189-
functionexceptionHandlerStr(){
190-
returnexceptionHandlerCalls.join('; ');
184+
functionexceptionHandler(exception,reason){
185+
if(typeofreason==='undefined'){
186+
exceptionHandlerCalls.push({reason:exception});
187+
}else{
188+
exceptionHandlerCalls.push({reason:reason,exception:exception});
189+
}
191190
}
192191

193-
194192
beforeEach(function(){
195193
q=qFactory(mockNextTick.nextTick,exceptionHandler,true);
196194
q_no_error=qFactory(mockNextTick.nextTick,exceptionHandler,false);
@@ -2167,45 +2165,98 @@ describe('q', function() {
21672165

21682166

21692167
describe('when exceptionHandler is called',function(){
2170-
it('should log an unhandled rejected promise',function(){
2171-
vardefer=q.defer();
2172-
defer.reject('foo');
2173-
mockNextTick.flush();
2174-
expect(exceptionHandlerStr()).toBe('Possibly unhandled rejection: foo');
2175-
});
2168+
functionCustomError(){}
2169+
CustomError.prototype=Object.create(Error.prototype);
21762170

2171+
varerrorEg=newError('Fail');
2172+
varerrorStr=toDebugString(errorEg);
21772173

2178-
it('should not log an unhandled rejected promise if disabled',function(){
2179-
vardefer=q_no_error.defer();
2180-
defer.reject('foo');
2181-
expect(exceptionHandlerStr()).toBe('');
2182-
});
2174+
varcustomError=newCustomError('Custom');
2175+
varcustomErrorStr=toDebugString(customError);
21832176

2177+
varnonErrorObj={isATest:'this is'};
2178+
varnonErrorObjStr=toDebugString(nonErrorObj);
21842179

2185-
it('should log a handled rejected promise on a promise without rejection callbacks',function(){
2186-
vardefer=q.defer();
2187-
defer.promise.then(noop);
2188-
defer.reject('foo');
2189-
mockNextTick.flush();
2190-
expect(exceptionHandlerStr()).toBe('Possibly unhandled rejection: foo');
2191-
});
2180+
varfixtures=[
2181+
{
2182+
type:'Error object',
2183+
value:errorEg,
2184+
expected:{
2185+
exception:errorEg,
2186+
reason:'Possibly unhandled rejection: '+errorStr
2187+
}
2188+
},
2189+
{
2190+
type:'custom Error object',
2191+
value:customError,
2192+
expected:{
2193+
exception:customError,
2194+
reason:'Possibly unhandled rejection: '+customErrorStr
2195+
}
2196+
},
2197+
{
2198+
type:'non-Error object',
2199+
value:nonErrorObj,
2200+
expected:{
2201+
reason:'Possibly unhandled rejection: '+nonErrorObjStr
2202+
}
2203+
},
2204+
{
2205+
type:'string primitive',
2206+
value:'foo',
2207+
expected:{
2208+
reason:'Possibly unhandled rejection: foo'
2209+
}
2210+
}
2211+
];
2212+
forEach(fixtures,function(fixture){
2213+
vartype=fixture.type;
2214+
varvalue=fixture.value;
2215+
varexpected=fixture.expected;
21922216

2217+
describe('with '+type,function(){
21932218

2194-
it('should not log a handled rejected promise',function(){
2195-
vardefer=q.defer();
2196-
defer.promise.catch(noop);
2197-
defer.reject('foo');
2198-
mockNextTick.flush();
2199-
expect(exceptionHandlerStr()).toBe('');
2200-
});
2219+
it('should log an unhandled rejected promise',function(){
2220+
vardefer=q.defer();
2221+
defer.reject(value);
2222+
mockNextTick.flush();
2223+
expect(exceptionHandlerCalls).toEqual([expected]);
2224+
});
22012225

22022226

2203-
it('should not log a handled rejected promise that is handled in a future tick',function(){
2204-
vardefer=q.defer();
2205-
defer.promise.catch(noop);
2206-
defer.resolve(q.reject('foo'));
2207-
mockNextTick.flush();
2208-
expect(exceptionHandlerStr()).toBe('');
2227+
it('should not log an unhandled rejected promise if disabled',function(){
2228+
vardefer=q_no_error.defer();
2229+
defer.reject(value);
2230+
expect(exceptionHandlerCalls).toEqual([]);
2231+
});
2232+
2233+
2234+
it('should log a handled rejected promise on a promise without rejection callbacks',function(){
2235+
vardefer=q.defer();
2236+
defer.promise.then(noop);
2237+
defer.reject(value);
2238+
mockNextTick.flush();
2239+
expect(exceptionHandlerCalls).toEqual([expected]);
2240+
});
2241+
2242+
2243+
it('should not log a handled rejected promise',function(){
2244+
vardefer=q.defer();
2245+
defer.promise.catch(noop);
2246+
defer.reject(value);
2247+
mockNextTick.flush();
2248+
expect(exceptionHandlerCalls).toEqual([]);
2249+
});
2250+
2251+
2252+
it('should not log a handled rejected promise that is handled in a future tick',function(){
2253+
vardefer=q.defer();
2254+
defer.promise.catch(noop);
2255+
defer.resolve(q.reject(value));
2256+
mockNextTick.flush();
2257+
expect(exceptionHandlerCalls).toEqual([]);
2258+
});
2259+
});
22092260
});
22102261
});
22112262
});

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp