We use panics for logic errors. This is an important distinction. We will never throw if a file couldn&#x27;t open, or if a string couldn&#x27;t parse, because these are expected errors that you should explicitly handle.<p>Catching panics should <i>never</i> be part of an application&#x27;s normal control flow in Rust, unlike e.g. Java and C#. These languages use exceptions to indicate <i>any</i> error condition, and therefore writing correct error handling code requires try&#x2F;catch.<p>Exceptions in Rust are used as a &quot;soft abort&quot;. A real abort tears down the entire process, and the OS handles releasing all associated resources. But if you&#x27;re writing a program that has logical tasks that resemble processes, the OS can&#x27;t individually tear those down for you. When an exception (panic) is thrown in Rust, the task has hit a situation that cannot be recovered, and tears itself down so the rest of the application can reclaim the resources.<p>The places in Rust where exceptions are thrown are usually places where the programmer has chosen not to handle a logic error -- usually indexing out of bounds, integer overflows (sometimes), or forcing an optional value. Things that would be RuntimeExceptions (unchecked exceptions) in Java.