Hone logo
Hone
Problems

Robust Angular Error Handling and Recovery

This challenge focuses on implementing robust error handling and recovery mechanisms within an Angular application. You will create a system that gracefully catches, logs, and recovers from unexpected errors, ensuring a better user experience and application stability. This is crucial for any production-ready application where unhandled errors can lead to crashes and user frustration.

Problem Description

Your task is to build a comprehensive error handling strategy in an Angular application. This involves implementing a global error handler, creating a mechanism to display user-friendly error messages, and optionally, implementing a way to recover from certain types of errors without a full page reload.

What needs to be achieved:

  1. Global Error Handling: Implement a custom Angular Error Handler that intercepts all uncaught errors.
  2. Error Logging: Log all intercepted errors to the console (simulating a more robust logging service).
  3. User-Friendly Feedback: Display a non-intrusive, user-friendly message to the user when an error occurs.
  4. Error Recovery (Optional but Recommended): Implement a basic recovery mechanism for specific error types (e.g., a network error that can be retried).

Key requirements:

  • Create a service responsible for handling and processing errors.
  • Register this service as the application's global error handler.
  • When an error occurs, the application should not crash.
  • The user should be informed about the error in a polite way.
  • Consider how to differentiate between critical errors that require a full page refresh (or re-initialization) and recoverable errors.

Expected behavior:

  • When a component or service throws an uncaught error, the global error handler should catch it.
  • The error details (message, stack trace) should be logged.
  • A visible, user-friendly message should appear on the screen (e.g., a toast notification, a banner, or a modal).
  • For recoverable errors, there should be an option for the user to attempt an action that might fix the issue (e.g., a "Retry" button).

Important edge cases to consider:

  • Errors occurring during component initialization.
  • Errors occurring during asynchronous operations (e.g., HTTP requests, promises).
  • Errors occurring within the error handling mechanism itself (e.g., if the logging service fails).
  • Handling errors that may not have a clear "recovery" path.

Examples

Example 1: Uncaught Component Error

Scenario: A component has a button that, when clicked, intentionally throws an error.

Input:

  • User clicks the "Throw Error" button in a component.
  • The component code:
    throw new Error('Something went wrong in the component!');
    

Output:

  • The application console logs the error: Error: Something went wrong in the component! with stack trace.
  • A toast notification appears saying: "An unexpected error occurred. Please try again later."
  • The application remains functional, and other parts of the UI are interactive.

Explanation: The global error handler catches the Error thrown by the component, logs it, and displays a user-friendly message. The application doesn't crash.

Example 2: Recoverable HTTP Error

Scenario: A service attempts to fetch data from an API that is temporarily unavailable (e.g., 503 Service Unavailable).

Input:

  • A service method calls an API endpoint that returns a 503 error.
  • The error handler identifies this as a "network" or "service unavailable" type of error.

Output:

  • The application console logs the HTTP error.
  • A toast notification appears saying: "The server is currently unavailable. Would you like to try again?" with "Retry" and "Dismiss" buttons.
  • If the user clicks "Retry", the service method is called again.
  • If the user clicks "Dismiss", the error message is dismissed, and the UI might display a placeholder or a message indicating data is unavailable.

Explanation: The error handler recognizes the specific error type, informs the user, and provides a recovery option.

Constraints

  • The solution must be implemented in TypeScript.
  • The solution must use Angular's built-in error handling mechanisms or standard Angular practices.
  • Avoid using window.onerror directly for primary error handling; leverage Angular's ErrorHandler interface.
  • The error logging should be performed to the browser's console (console.error).
  • For the recovery mechanism, simulate retry logic for a specific error type (e.g., by checking error.status for an HTTP error).
  • The UI feedback mechanism can be a simple alert or a basic console log indicating a message is being displayed (for simplicity, a full UI toast component implementation is not strictly required for this challenge, but understanding how it would work is key).

Notes

  • Consider using Angular's HttpClient and its HttpErrorResponse to simulate network errors.
  • Think about how you would categorize errors to decide if recovery is possible.
  • The goal is to demonstrate a structured approach to error management, not necessarily a complex UI for error reporting.
  • You might want to create a custom ErrorStateMatcher or similar concept to identify recoverable errors.
  • For the purpose of this challenge, you can simulate errors by throwing them manually or by configuring your Angular HttpClient to return errors.
Loading editor...
typescript