Improved Logging
parent
d9f58bd09a
commit
781e52aae0
@ -0,0 +1,58 @@
|
|||||||
|
// filepath: /Volumes/Data/Projects/Flutter/HMG_QLine/lib/services/crash_handler_service.dart
|
||||||
|
import 'dart:async';
|
||||||
|
import 'dart:developer';
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hmg_qline/services/logger_service.dart';
|
||||||
|
|
||||||
|
// Abstract interface for crash handling (matches style of ConnectivityService)
|
||||||
|
abstract class CrashHandlerService {
|
||||||
|
/// Install global error handlers for Flutter and platform errors.
|
||||||
|
void setupGlobalErrorHandlers();
|
||||||
|
|
||||||
|
/// Central crash handler for logging/reporting crashes.
|
||||||
|
Future<void> handleCrash({required Object error, StackTrace? stackTrace, String? context});
|
||||||
|
}
|
||||||
|
|
||||||
|
class CrashHandlerServiceImp implements CrashHandlerService {
|
||||||
|
final LoggerService loggerService;
|
||||||
|
|
||||||
|
CrashHandlerServiceImp({required this.loggerService});
|
||||||
|
|
||||||
|
/// Sets up global error handlers for Flutter framework errors and platform errors.
|
||||||
|
@override
|
||||||
|
void setupGlobalErrorHandlers() {
|
||||||
|
// Flutter framework errors
|
||||||
|
FlutterError.onError = (FlutterErrorDetails details) async {
|
||||||
|
try {
|
||||||
|
final error = details.exception;
|
||||||
|
final stack = details.stack;
|
||||||
|
await handleCrash(error: error, stackTrace: stack, context: 'FlutterError.onError');
|
||||||
|
} catch (e, st) {
|
||||||
|
// include stack trace in the log to avoid unused variable warning
|
||||||
|
log('Error while handling FlutterError.onError: $e\nStack: $st');
|
||||||
|
loggerService.logError('Error while handling FlutterError.onError: $e\nStack: $st');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// PlatformDispatcher (engine) errors
|
||||||
|
PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
|
||||||
|
handleCrash(error: error, stackTrace: stack, context: 'PlatformDispatcher.onError');
|
||||||
|
return true; // we handled it
|
||||||
|
};
|
||||||
|
|
||||||
|
// note: Zone errors are handled by runZonedGuarded where runApp is invoked
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Central crash handler. Logs crash info and can be extended to report to remote services.
|
||||||
|
@override
|
||||||
|
Future<void> handleCrash({required Object error, StackTrace? stackTrace, String? context}) async {
|
||||||
|
try {
|
||||||
|
await loggerService.logCrash(error: error, stackTrace: stackTrace, context: context);
|
||||||
|
} catch (e) {
|
||||||
|
// ensure we don't throw while handling crashes
|
||||||
|
log('CrashHandlerService failed to log crash: $e');
|
||||||
|
loggerService.logError('CrashHandlerService failed to log crash: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue