Skip to content

Errors during model hooks should emit to Ember.onerror #18533

Closed
@rwjblue

Description

@rwjblue

Currently, when a model hook rejects we bubble up the route hierarchy looking for any route that implements an error action. If we get to the top (above application route) we have some default behavior for the error action:

// Attempt to find an appropriate error route or substate to enter.
error(routeInfos: PrivateRouteInfo[], error: Error, transition: Transition) {
let router: any = this;
let routeInfoWithError = routeInfos[routeInfos.length - 1];
forEachRouteAbove(routeInfos, (route: Route, routeInfo: PrivateRouteInfo) => {
// We don't check the leaf most routeInfo since that would
// technically be below where we're at in the route hierarchy.
if (routeInfo !== routeInfoWithError) {
// Check for the existence of an 'error' route.
let errorRouteName = findRouteStateName(route, 'error');
if (errorRouteName) {
router._markErrorAsHandled(error);
router.intermediateTransitionTo(errorRouteName, error);
return false;
}
}
// Check for an 'error' substate route
let errorSubstateName = findRouteSubstateName(route, 'error');
if (errorSubstateName) {
router._markErrorAsHandled(error);
router.intermediateTransitionTo(errorSubstateName, error);
return false;
}
return true;
});
logError(error, `Error while processing route: ${transition.targetName}`);
},

Which invokes logError, defined here:

function logError(_error: any, initialMessage: string) {
let errorArgs = [];
let error;
if (_error && typeof _error === 'object' && typeof _error.errorThrown === 'object') {
error = _error.errorThrown;
} else {
error = _error;
}
if (initialMessage) {
errorArgs.push(initialMessage);
}
if (error) {
if (error.message) {
errorArgs.push(error.message);
}
if (error.stack) {
errorArgs.push(error.stack);
}
if (typeof error === 'string') {
errorArgs.push(error);
}
}
console.error(...errorArgs); //eslint-disable-line no-console
}

As you can see, logError is a small layer on top of console.error. Unfortunately, this means that any errors during model hooks will not be sent to Ember.onerror (unless you also implement error on your application route).

We should fix this by checking if there is an Ember.onerror and invoking it with the error, falling back to logError.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions