Update April 2020:
Das Problem scheint in React 16.13.1 behoben zu sein (siehe dieses Sandbox-Beispiel) . Vielen Dank an @abernier für diesen Hinweis.
Ich habe einige Nachforschungen angestellt und einen wichtigen Unterschied festgestellt:
React verarbeitet keine Fehler aus asynchronen Lebenszyklusmethoden.
Also, wenn Sie so etwas schreiben:
componentDidMount()
{
throw new Error('I crashed!');
}
Dann wird Ihr Fehler von der Fehlergrenze erfasst , und Sie können ihn verarbeiten und eine ordnungsgemäße Meldung anzeigen.
Wenn wir den Code folgendermaßen ändern:
async componentDidMount()
{
throw new Error('I crashed!');
}
was dem entspricht:
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
dann wird Ihr Fehler lautlos verschluckt . Schande über dich, reagiere ...
Wie verarbeiten wir Fehler als? Der einzige Weg scheint ein expliziter Fang wie dieser zu sein:
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
oder so:
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
Wenn wir immer noch wollen, dass unser Fehler die Fehlergrenze erreicht, kann ich über den folgenden Trick nachdenken:
- Fangen Sie den Fehler ab und lassen Sie den Fehlerbehandler den Komponentenstatus ändern
- Wenn der Status einen Fehler anzeigt, werfen Sie ihn aus der
render
Methode
Beispiel:
class BuggyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
}
buggyAsyncfunction(){ return Promise.reject(new Error('I crashed async!'));}
async componentDidMount() {
try
{
await this.buggyAsyncfunction();
}
catch(error)
{
this.setState({error: error});
}
}
render() {
if(this.state.error)
throw this.state.error;
return <h1>I am OK</h1>;
}
}