masklinn already made lots of good points. I'd add that panics in Rust are for intended for non-recoverable errors (like memory allocation failures, out-of-bounds access) and under most use cases are equivalent to abort(). There are mechanisms to catch panics in Rust, but the docs state:
"It is not recommended to use this function for a general try/catch mechanism. The Result type is more appropriate to use for functions that can fail on a regular basis. Additionally, this function is not guaranteed to catch all panics, see the “Notes” section below."
> atomic transactions that are undone when something fails
This is exactly what many business apps do frequently, through the use of database transactions.
[1] https://doc.rust-lang.org/std/panic/fn.catch_unwind.html