Ontwerp een Robuuste Foutafhandelingsstrategie voor Mijn React Native App
description
Met deze prompt stel je een degelijk foutbeheersysteem op dat specifiek is afgestemd op je React Native-app, waardoor crashes verminderen en gebruikersvertrouwen toeneemt door duidelijke feedback en eenvoudiger foutopsporing. Het is gerichter dan algemene prestatieprompts en vult een nog niet behandelde behoefte.
prompt
Help me met het creëren van een uitgebreide foutafhandelings- en loggingstrategie voor mijn React Native-app. Leg best practices uit voor het opvangen en beheren van fouten op een nette manier, het integreren van foutvolgsystemen en het geven van duidelijk ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Zeker! Hier is een uitgebreide gids voor het opzetten van een foutafhandelings- en loggingstrategie in je React Native-app, gericht op best practices en jouw specifieke context:
1. Globale foutafhandeling
a. Uncaught JavaScript-fouten opvangen:
Gebruik `ErrorUtils.setGlobalHandler` om ongedekte fouten in React Native te onderscheppen:
```javascript
import { Alert } from 'react-native';
const globalErrorHandler = (error, isFatal) => {
// Log de fout
console.log('Globale fout:', error);
// Optioneel: verzend foutrapport
sendErrorToServer(error, isFatal);
if (isFatal) {
// Toon een gebruikersvriendelijke melding
Alert.alert(
'Er is een onverwachte fout opgetreden',
'De app moet worden afgesloten. Herstart de app.',
[{ text: 'OK', onPress: () => {/* Optioneel: afsluiten of herstarten */} }]
);
}
};
ErrorUtils.setGlobalHandler(globalErrorHandler);
```
b. Fouten in componenten en functies afvangen:
Gebruik try-catch blokken rondom kritieke code, vooral bij netwerkverzoeken:
```javascript
try {
await fetchData();
} catch (error) {
console.log('Netwerkfout:', error);
// Feedback aan gebruiker
Alert.alert('Netwerkfout', 'Controleer je internetverbinding en probeer opnieuw.');
// Verzamel foutgegevens
sendErrorToServer(error);
}
```
2. Netwerkfouten specifiek beheren
- Detecteer en behandel netwerkproblemen expliciet door bijv. `fetch` of `axios` te gebruiken met error-afhandeling.
- Gebruik `NetInfo` (van `@react-native-community/netinfo`) om netwerkstatus te monitoren en gebruikers te informeren:
```javascript
import NetInfo from '@react-native-community/netinfo';
NetInfo.addEventListener(state => {
if (!state.isConnected) {
Alert.alert('Geen internetverbinding', 'Je hebt momenteel geen internetverbinding.');
}
});
```
3. Crashrapportage en foutvolgsystemen integreren
- Integreer tools zoals Sentry, Bugsnag of Firebase Crashlytics voor geavanceerde fouttracking:
```javascript
import * as Sentry from '@sentry/react-native';
Sentry.init({ dsn: 'JOUW_DSN_URL' });
// Bij fouten:
Sentry.captureException(error);
```
- Zorg dat je foutgegevens automatisch worden gestuurd bij crashes en fouten.
4. Loggingstrategie
- Gebruik een gestructureerde aanpak:
- Logserieniveau (info, waarschuwing, fout)
- Contextuele info (gebruikersactie, scherm, component)
- Beperk console logging in productie; gebruik een loggingbibliotheek of aangepaste logger die logs kan sturen naar een externe server.
5. Gebruikersfeedback
- Toon duidelijke, niet-technische berichten bij fouten:
```javascript
Alert.alert(
'Oeps!',
'Er is iets misgegaan. Probeer het later nog eens.',
[{ text: 'OK' }]
);
```
- Geef opties voor herladen of contact opnemen.
6. Best practices
- Minimaliseer het gebruik van try-catch: gebruik het waar het echt nodig is.
- Zorg voor consistente foutafhandeling op alle niveaus.
- Test foutscenario’s grondig (bijvoorbeeld door netwerk uit te schakelen).
- Documenteer je foutafhandelingsproces en training voor je team.
Door bovenstaande strategieën te implementeren, verbeter je de stabiliteit van je app, krijg je waardevolle inzichten in fouten en bied je gebruikers een prettige ervaring, zelfs bij problemen.
provider: deepseek
model: deepseek-chat
Zeker, hier is een uitgebreide strategie voor foutafhandeling en logging in React Native:
## 1. Gestructureerde Foutafhandeling
### Globale Foutafhandeling
```javascript
// ErrorBoundary.js
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false, error: null };
}
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
componentDidCatch(error, errorInfo) {
console.error('Error Boundary caught:', error, errorInfo);
// Log naar je tracking service
this.logError(error, errorInfo);
}
render() {
if (this.state.hasError) {
return this.props.fallback || <DefaultErrorScreen />;
}
return this.props.children;
}
}
```
### Gebruik in je app:
```javascript
// App.js
import ErrorBoundary from './ErrorBoundary';
const App = () => {
return (
<ErrorBoundary fallback={<CustomErrorScreen />}>
<YourApp />
</ErrorBoundary>
);
};
```
## 2. Netwerkfoutafhandeling
### Gestandaardiseerde API calls
```javascript
// apiService.js
class ApiService {
async makeRequest(url, options = {}) {
try {
const response = await fetch(url, {
timeout: 10000,
...options
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
} catch (error) {
this.handleNetworkError(error);
throw error;
}
}
handleNetworkError(error) {
let userMessage = 'Er ging iets mis';
if (error.message.includes('Network request failed')) {
userMessage = 'Geen internetverbinding';
} else if (error.message.includes('timeout')) {
userMessage = 'Verzoek duurt te lang';
} else if (error.message.includes('4')) {
userMessage = 'Serverfout - probeer het later opnieuw';
} else if (error.message.includes('5')) {
userMessage = 'Probleem met de server';
}
// Toon gebruikersfeedback
Alert.alert('Fout', userMessage);
// Log de fout
Logger.error('Network Error', {
error: error.message,
userMessage,
timestamp: new Date().toISOString()
});
}
}
```
## 3. Geavanceerde Logging Service
```javascript
// Logger.js
class Logger {
static levels = {
ERROR: 0,
WARN: 1,
INFO: 2,
DEBUG: 3
};
static log(level, message, metadata = {}) {
const logEntry = {
level,
message,
timestamp: new Date().toISOString(),
platform: Platform.OS,
version: DeviceInfo.getVersion(),
...metadata
};
// Console logging (alleen in development)
if (__DEV__) {
console[level.toLowerCase()](message, logEntry);
}
// Stuur naar externe service in production
if (!__DEV__) {
this.sendToRemote(logEntry);
}
}
static error(message, metadata) {
this.log('ERROR', message, metadata);
}
static warn(message, metadata) {
this.log('WARN', message, metadata);
}
static info(message, metadata) {
this.log('INFO', message, metadata);
}
static debug(message, metadata) {
this.log('DEBUG', message, metadata);
}
static async sendToRemote(logEntry) {
try {
await fetch('YOUR_LOGGING_ENDPOINT', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(logEntry)
});
} catch (error) {
// Fallback: sla lokaal op
this.storeLocally(logEntry);
}
}
static storeLocally(logEntry) {
// Gebruik AsyncStorage of een lokale database
AsyncStorage.getItem('app_logs')
.then(logs => {
const existingLogs = logs ? JSON.parse(logs) : [];
existingLogs.push(logEntry);
// Beperk tot laatste 100 logs
const limitedLogs = existingLogs.slice(-100);
AsyncStorage.setItem('app_logs', JSON.stringify(limitedLogs));
});
}
}
```
## 4. Fout Tracking Integratie
### Sentry (aanbevolen)
```javascript
// monitoring.js
import * as Sentry from '@sentry/react-native';
Sentry.init({
dsn: 'YOUR_SENTRY_DSN',
environment: __DEV__ ? 'development' : 'production',
beforeSend(event) {
// Filter gevoelige informatie
delete event.request?.cookies;
return event;
}
});
// Gebruik in componenten
const trackError = (error, context = {}) => {
Sentry.withScope(scope => {
scope.setExtras(context);
Sentry.captureException(error);
});
Logger.error('Sentry tracked error', { error: error.message, ...context });
};
```
## 5. Gebruikersfeedback
### Vriendelijke foutschermen
```javascript
// ErrorScreens.js
import React from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';
export const NetworkErrorScreen = ({ onRetry }) => (
<View style={styles.container}>
<Text style={styles.title}>Geen verbinding</Text>
<Text style={styles.message}>
Controleer je internetverbinding en probeer opnieuw
</Text>
<Button title="Opnieuw proberen" onPress={onRetry} />
</View>
);
export const GenericErrorScreen = ({ onRetry, onReport }) => (
<View style={styles.container}>
<Text style={styles.title}>Er ging iets mis</Text>
<Text style={styles.message}>
Onverwachte fout opgetreden. We werken eraan!
</Text>
<View style={styles.buttonContainer}>
<Button title="Opnieuw proberen" onPress={onRetry} />
<Button title="Fout melden" onPress={onReport} />
</View>
</View>
);
```
## 6. Platform-specifieke Afhandeling
```javascript
// platformHandling.js
import { Platform, Alert } from 'react-native';
export const handlePlatformSpecificError = (error) => {
if (Platform.OS === 'ios') {
// iOS-specifieke foutafhandeling
if (error.code === 'EAI_AGAIN') {
return 'DNS-fout - controleer je netwerk';
}
} else if (Platform.OS === 'android') {
// Android-specifieke foutafhandeling
if (error.message.includes('CLEARTEXT')) {
return 'Beveiligingsfout - gebruik HTTPS';
}
}
return 'Onbekende fout opgetreden';
};
```
## 7. Best Practices Checklist
### ✅ Implementeer altijd:
- Error Boundaries voor React componenten
- Try-catch blokken voor async operaties
- Netwerk status monitoring
- Gestructureerde logging
- Gebruikersvriendelijke foutmeldingen
### ✅ Vermijd:
- `console.log` in production
- Technische foutmeldingen tonen aan gebruikers
- Fouten negeren in promises
- Geen feedback bij laadstates
### ✅ Testscenario's:
- Schakel wifi/4G uit tijdens API calls
- Forceer memory warnings
- Test met trage netwerken
- Simuleer server errors
## 8. Aanbevolen Libraries
```bash
npm install @sentry/react-native
npm install react-native-device-info
npm install @react-native-async-storage/async-storage
```
Deze strategie zorgt voor robuuste foutafhandeling, gedetailleerde logging en een professionele gebruikerservaring, zelfs wanneer er dingen misgaan.