From 46ca1948e2f4b7eec03f94138e20b618dc0b8762 Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Fri, 1 May 2020 16:24:13 +0000 Subject: [PATCH] Error handling improvements --- lib/cards/card.class.dart | 9 ++++----- lib/entities/timer/timer_entity.class.dart | 4 ++-- lib/entities/timer/widgets/timer_state.dart | 4 ++-- lib/main.dart | 4 ++-- lib/managers/auth_manager.class.dart | 2 +- lib/managers/connection_manager.class.dart | 8 ++++---- .../mobile_app_integration_manager.class.dart | 6 +++--- lib/utils/logger.dart | 12 ++++++------ 8 files changed, 24 insertions(+), 25 deletions(-) diff --git a/lib/cards/card.class.dart b/lib/cards/card.class.dart index 02a9957..7150652 100644 --- a/lib/cards/card.class.dart +++ b/lib/cards/card.class.dart @@ -65,8 +65,8 @@ class CardData { } return CardData(rawData); } - } catch (error) { - Logger.e('Error parsing card: $error'); + } catch (error, stacktrace) { + Logger.e('Parsing ${rawData['type']} card: $error', stacktrace: stacktrace); return ErrorCardData(rawData); } } @@ -148,9 +148,8 @@ class CardData { break; } } - } catch (e) { - Logger.e('Error filtering ${entityWrapper.entity.entityId} by $allowedState'); - Logger.e('$e'); + } catch (e, stacktrace) { + Logger.e('Error filtering ${entityWrapper.entity.entityId} by $allowedState: $e', stacktrace: stacktrace); } } } diff --git a/lib/entities/timer/timer_entity.class.dart b/lib/entities/timer/timer_entity.class.dart index f0e5134..7d38908 100644 --- a/lib/entities/timer/timer_entity.class.dart +++ b/lib/entities/timer/timer_entity.class.dart @@ -29,8 +29,8 @@ class TimerEntity extends Entity { Logger.e("Strange $entityId duration format: $durationSource"); duration = Duration(seconds: 0); } - } catch (e) { - Logger.e("Error parsing duration for $entityId: ${e.toString()}"); + } catch (e, stacktrace) { + Logger.e("Error parsing duration for $entityId: $e", stacktrace: stacktrace); duration = Duration(seconds: 0); } } else { diff --git a/lib/entities/timer/widgets/timer_state.dart b/lib/entities/timer/widgets/timer_state.dart index c427952..2b7e0f6 100644 --- a/lib/entities/timer/widgets/timer_state.dart +++ b/lib/entities/timer/widgets/timer_state.dart @@ -30,8 +30,8 @@ class _TimerStateState extends State { .difference(entity.lastUpdatedTimestamp) .inSeconds; remaining = Duration(seconds: entity.duration.inSeconds - passed); - } catch (e) { - Logger.e("Error calculating ${entity.entityId} remaining time: ${e.toString()}"); + } catch (e, stacktrace) { + Logger.e("Error calculating ${entity.entityId} remaining time: $e", stacktrace: stacktrace); remaining = Duration(seconds: 0); } }); diff --git a/lib/main.dart b/lib/main.dart index 5d295aa..6e6c5f7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -163,7 +163,7 @@ const appVersion = "$appVersionNumber-$appVersionAdd"; Future _reportError(dynamic error, dynamic stackTrace) async { // Print the exception to the console. if (Logger.isInDebugMode) { - Logger.e('Caught error: $error'); + Logger.e('Caught error: $error', skipCrashlytics: true); Logger.p(stackTrace); } Crashlytics.instance.recordError(error, stackTrace); @@ -175,7 +175,7 @@ void main() async { SyncfusionLicense.registerLicense(secrets['syncfusion_license_key']); FlutterError.onError = (FlutterErrorDetails details) { - Logger.e("Caut Flutter runtime error: ${details.exception}"); + Logger.e("Caut Flutter runtime error: ${details.exception}", skipCrashlytics: true); if (Logger.isInDebugMode) { FlutterError.dumpErrorToConsole(details); } diff --git a/lib/managers/auth_manager.class.dart b/lib/managers/auth_manager.class.dart index b1225f5..632f317 100644 --- a/lib/managers/auth_manager.class.dart +++ b/lib/managers/auth_manager.class.dart @@ -31,7 +31,7 @@ class AuthManager { eventBus.fire(StartAuthEvent(oauthUrl, false)); completer.complete(tempToken); }).catchError((e) { - Logger.e("Error getting temp token: ${e.toString()}"); + Logger.e("Error getting temp token: $e"); eventBus.fire(StartAuthEvent(oauthUrl, false)); completer.completeError(HACException("Error getting temp token")); }).whenComplete(() => flutterWebviewPlugin.close()); diff --git a/lib/managers/connection_manager.class.dart b/lib/managers/connection_manager.class.dart index 122cd03..3a2b383 100644 --- a/lib/managers/connection_manager.class.dart +++ b/lib/managers/connection_manager.class.dart @@ -65,9 +65,9 @@ class ConnectionManager { .encodeComponent( 'https://ha-client.app/service/auth_callback.html')}"; settingsLoaded = true; - } catch (e) { + } catch (e, stacktrace) { completer.completeError(HACException("Error reading login details", actions: [HAErrorAction.tryAgain(type: HAErrorActionType.FULL_RELOAD), HAErrorAction.loginAgain()])); - Logger.e("Cannt read secure storage. Need to relogin."); + Logger.e("Error reading secure storage: $e", stacktrace: stacktrace); stopInit = true; } } @@ -212,7 +212,7 @@ class ConnectionManager { //Logger.d("[Received] <== Request id ${data['id']} was successful"); _messageResolver["${data["id"]}"]?.complete(data["result"]); } else if (data["id"] != null) { - Logger.e("[Received] <== Error received on request id ${data['id']}: ${data['error']}"); + Logger.e("[Received] <== Error received on request id ${data['id']}: ${data['error']}", skipCrashlytics: true); _messageResolver["${data["id"]}"]?.completeError("${data["error"]["code"]}: ${data["error"]["message"]}"); } _messageResolver.remove("${data["id"]}"); @@ -243,7 +243,7 @@ class ConnectionManager { } void _handleSocketError(e, Completer connectionCompleter) { - Logger.e("Socket stream Error: $e"); + Logger.e("Socket stream Error: $e", skipCrashlytics: true); _disconnect().then((_) { if (!connectionCompleter.isCompleted) { isConnected = false; diff --git a/lib/managers/mobile_app_integration_manager.class.dart b/lib/managers/mobile_app_integration_manager.class.dart index 95fcdfd..b6133b3 100644 --- a/lib/managers/mobile_app_integration_manager.class.dart +++ b/lib/managers/mobile_app_integration_manager.class.dart @@ -56,7 +56,7 @@ class MobileAppIntegrationManager { }); }).catchError((e) { completer.complete(); - Logger.e("Error registering the app: ${e.toString()}"); + Logger.e("Error registering the app: $e"); }); return completer.future; } else { @@ -98,10 +98,10 @@ class MobileAppIntegrationManager { completer.complete(); }).catchError((e) { if (e is http.Response && e.statusCode == 410) { - Logger.e("MobileApp integration was removed"); + Logger.e("MobileApp integration was removed", skipCrashlytics: true); _askToRegisterApp(); } else { - Logger.e("Error updating app registration: ${e.toString()}"); + Logger.e("Error updating app registration: $e"); eventBus.fire(ShowPopupDialogEvent( title: "App integration is not working properly", body: "Something wrong with HA Client integration on your Home Assistant server. Please report this issue.", diff --git a/lib/utils/logger.dart b/lib/utils/logger.dart index 4a6e715..faeeba8 100644 --- a/lib/utils/logger.dart +++ b/lib/utils/logger.dart @@ -29,22 +29,22 @@ class Logger { print(data); } - static void e(String message, {dynamic stacktrace}) { - _writeToLog(ErrorLevel.ERROR, message, stacktrace); + static void e(String message, {dynamic stacktrace, bool skipCrashlytics: false}) { + _writeToLog(ErrorLevel.ERROR, message, stacktrace, skipCrashlytics); } static void w(String message) { - _writeToLog(ErrorLevel.WARNING, message, null); + _writeToLog(ErrorLevel.WARNING, message, null, true); } static void d(String message) { - _writeToLog(ErrorLevel.DEBUG, message, null); + _writeToLog(ErrorLevel.DEBUG, message, null, true); } - static void _writeToLog(ErrorLevel level, String message, dynamic stacktrace) { + static void _writeToLog(ErrorLevel level, String message, dynamic stacktrace, bool skipCrashlytics) { if (isInDebugMode) { debugPrint('$message'); - } else if (level == ErrorLevel.ERROR) { + } else if (!skipCrashlytics) { Crashlytics.instance.recordError('$message', stacktrace); } DateTime t = DateTime.now();