It’s not a “non-return” though. (And you also don’t have to write an explicit return, but that’s a different question). Unfortunately, many people these days confuse “no return” (i.e. divergence) and “return with data of no information contents”. I guess this is a result of decades of bad pedagogy: mainstream languages such as C and Java have been calling the unit type void since forever, and many didn’t even have the distinction between a function that doesn’t ever return and one that returns no information.
The first class of functions, those which diverge (e.g. process::exit(), or something that loops forever, e.g. a HTTP server) would/could have a return type of !, also called never in Rust (and also, correctly, called void in some functional languages). In contrast, a function that does return but with no information returns () (the empty tuple, usually called “unit” in the functional world), and there’s a special case in Rust whereby omitting an explicit return type from an fn item results in an assumed return type of (), and omitting a return value will imply () (the value) to be returned too. Again, this is a special case and not something natural or regular.
Note that there are two, distinct levels of “nothingness” going on here. ! is a type that doesn’t have any possible values (it’s uninhabited), whereas () is a type that does have a possible value (ie. it’s inhabited), but its information content is zero because there’s only one possible value for it.