Hone logo
Hone
Problems

Graceful Panic Recovery in Go

Panics in Go can lead to abrupt program termination. This challenge focuses on implementing a robust panic recovery mechanism that allows your program to continue execution after a panic occurs, logging the error and potentially attempting a graceful shutdown. This is crucial for building resilient applications that can handle unexpected errors without crashing.

Problem Description

You are tasked with creating a Go program that demonstrates panic recovery. The program should:

  1. Define a function mightPanic(): This function will simulate a scenario where a panic might occur. It should randomly decide whether to panic or not. If it panics, it should panic with a descriptive message.
  2. Implement a recover() mechanism: Wrap the call to mightPanic() in a defer statement with a recover() call. This will allow you to catch the panic.
  3. Log the panic: If a panic is recovered, log the panic message to the console. Use the log package for this.
  4. Continue execution: After logging the panic, the program should continue executing normally. Include a message indicating that the program has recovered and is continuing.
  5. Handle multiple panics: The program should be able to handle multiple panics in sequence. Each panic should be logged, and the program should continue.

Expected Behavior:

The program should call mightPanic() multiple times. Some calls will panic, and others will not. When a panic occurs, the recover() mechanism should catch it, log the panic message, and allow the program to continue. The program should print a message indicating successful recovery after each panic. If no panic occurs, the program should simply continue to the next iteration.

Examples

Example 1:

Input: Program execution with `mightPanic()` called 5 times, with 2 panics occurring randomly.
Output:
2023/10/27 10:00:00 Panic occurred: Division by zero
Recovered from panic and continuing...
2023/10/27 10:00:01 Panic occurred: Null pointer dereference
Recovered from panic and continuing...
2023/10/27 10:00:02 No panic occurred.
2023/10/27 10:00:03 No panic occurred.
2023/10/27 10:00:04 No panic occurred.

Explanation: The program called mightPanic() five times. Two of those calls resulted in panics, which were caught and logged. The program then continued execution.

Example 2:

Input: Program execution with `mightPanic()` called 3 times, all resulting in panics.
Output:
2023/10/27 10:01:00 Panic occurred: Index out of range
Recovered from panic and continuing...
2023/10/27 10:01:01 Panic occurred: Invalid argument
Recovered from panic and continuing...
2023/10/27 10:01:02 Panic occurred: Memory allocation error
Recovered from panic and continuing...

Explanation: All three calls to mightPanic() resulted in panics, which were successfully caught and logged.

Example 3: (Edge Case - No Panics)

Input: Program execution with `mightPanic()` called 4 times, none resulting in panics.
Output:
2023/10/27 10:02:00 No panic occurred.
2023/10/27 10:02:01 No panic occurred.
2023/10/27 10:02:02 No panic occurred.
2023/10/27 10:02:03 No panic occurred.

Explanation: The program executed without any panics.

Constraints

  • The mightPanic() function must be defined and called within the main function.
  • The panic messages should be descriptive and informative.
  • The program must use the log package for logging.
  • The program must continue execution after recovering from a panic.
  • The program should handle at least 3 calls to mightPanic().
  • The mightPanic() function should have a 50% chance of panicking.

Notes

  • The defer statement and recover() function are key to implementing panic recovery.
  • Consider using a random number generator to simulate the possibility of a panic.
  • Think about how to ensure the program continues gracefully after a panic, potentially cleaning up resources or attempting a restart.
  • The timestamp in the log output is for demonstration purposes and doesn't need to be perfectly accurate. The important thing is that the panic message is logged.
Loading editor...
go