J'ai une limite d'erreur définie en haut de mon arbre de composants, comme ceci :
renderApp() {
return (
<ErrorBoundary>
{ this.props.children }
</ErrorBoundary>
);
}
Si une erreur se retrouve dans l'arbre, la frontière d'erreur rend une page d'erreur simple, en passant l'erreur elle-même comme une propriété :
componentDidCatch(error, info) {
this.setState({
hasError: true,
error
});
}
render() {
if (this.state.hasError) {
return (
<ErrorPage error={this.state.error}/>
);
}
return this.props.children;
}
J'ai commencé à définir des erreurs personnalisées à lancer dans l'application lorsque certaines exceptions sont levées, en étendant simplement la classe Error :
class CustomError extends Error {}
Ensuite, dans mes composants, je lance ces erreurs personnalisées, que j'aimerais détecter dans ma page d'erreur et construire une messagerie basée sur leur type. Par exemple, si je lance cette erreur plus bas dans l'arbre des composants :
throw new CustomError('This is the custom error message');
J'aimerais pouvoir détecter le type d'erreur dans ma page d'erreur et afficher des messages pertinents pour ce type.
import CustomError from '../../errors/custom-error';
// This code has obviously been edited for brevity's sake
class ErrorPage extends React.Component {
render() {
if (this.props.error instanceof CustomError) {
errorMessage = "A custom error occurred.";
}
return <div>{errorMessage}</div>;
}
}
Cependant, dans la page d'erreur, React reconnaît seulement que this.props.error est une instanceof Error
et non de CustomError
. Si je lance, disons, un TypeError
au lieu d'un CustomError
alors la page d'erreur peut détecter le type d'erreur. Mais en passant le type d'erreur personnalisé, la page d'erreur ne sait rien du type d'erreur, si ce n'est qu'il s'agit d'une erreur, ce qui va évidemment à l'encontre de l'objectif de la définition de types d'erreur personnalisés. Qu'est-ce que j'ai manqué ici ? S'agit-il d'un bug dans React ? Toute contribution serait la bienvenue.
J'ai découvert ce problème en utilisant React 16.0.0, j'ai mis à jour vers 16.2.0 et le problème persiste.