# Panics Let's go back to the `speed` function you wrote for the ["Variables" section](02_variables.md). It probably looked something like this: ```rust fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 { let distance = end - start; distance / time_elapsed } ``` If you have a keen eye, you might have spotted one issue[^one]: what happens if `time_elapsed` is zero? You can try it out [on the Rust playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=36e5ddbe3b3f741dfa9f74c956622bac)!\ The program will exit with the following error message: ```text thread 'main' panicked at src/main.rs:3:5: attempt to divide by zero ``` This is known as a **panic**.\ A panic is Rust's way to signal that something went so wrong that the program can't continue executing, it's an **unrecoverable error**[^catching]. Division by zero classifies as such an error. ## The panic! macro You can intentionally trigger a panic by calling the `panic!` macro[^macro]: ```rust fn main() { panic!("This is a panic!"); // The line below will never be executed let x = 1 + 2; } ``` There are other mechanisms to work with recoverable errors in Rust, which [we'll cover later](../05_ticket_v2/06_fallibility.md). For the time being we'll stick with panics as a brutal but simple stopgap solution. ## Further reading - [The panic! macro documentation](https://doc.rust-lang.org/std/macro.panic.html) [^one]: There's another issue with `speed` that we'll address soon enough. Can you spot it? [^catching]: You can try to catch a panic, but it should be a last resort attempt reserved for very specific circumstances. [^macro]: If it's followed by a `!`, it's a macro invocation. Think of macros as spicy functions for now. We'll cover them in more detail later in the course.