Rollup merge of #115310 - RalfJung:panic-and-format, r=scottmcm
Document panic behavior across editions, and improve xrefs This revives (parts of) https://github.com/rust-lang/rust/pull/96518. r? `@scottmcm` Cc `@ijackson`
This commit is contained in:
commit
2eff0deca3
4 changed files with 45 additions and 7 deletions
|
@ -79,10 +79,12 @@ macro_rules! vec {
|
||||||
///
|
///
|
||||||
/// The first argument `format!` receives is a format string. This must be a string
|
/// The first argument `format!` receives is a format string. This must be a string
|
||||||
/// literal. The power of the formatting string is in the `{}`s contained.
|
/// literal. The power of the formatting string is in the `{}`s contained.
|
||||||
///
|
|
||||||
/// Additional parameters passed to `format!` replace the `{}`s within the
|
/// Additional parameters passed to `format!` replace the `{}`s within the
|
||||||
/// formatting string in the order given unless named or positional parameters
|
/// formatting string in the order given unless named or positional parameters
|
||||||
/// are used; see [`std::fmt`] for more information.
|
/// are used.
|
||||||
|
///
|
||||||
|
/// See [the formatting syntax documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details.
|
||||||
///
|
///
|
||||||
/// A common use for `format!` is concatenation and interpolation of strings.
|
/// A common use for `format!` is concatenation and interpolation of strings.
|
||||||
/// The same convention is used with [`print!`] and [`write!`] macros,
|
/// The same convention is used with [`print!`] and [`write!`] macros,
|
||||||
|
@ -91,7 +93,6 @@ macro_rules! vec {
|
||||||
/// To convert a single value to a string, use the [`to_string`] method. This
|
/// To convert a single value to a string, use the [`to_string`] method. This
|
||||||
/// will use the [`Display`] formatting trait.
|
/// will use the [`Display`] formatting trait.
|
||||||
///
|
///
|
||||||
/// [`std::fmt`]: ../std/fmt/index.html
|
|
||||||
/// [`print!`]: ../std/macro.print.html
|
/// [`print!`]: ../std/macro.print.html
|
||||||
/// [`write!`]: core::write
|
/// [`write!`]: core::write
|
||||||
/// [`to_string`]: crate::string::ToString
|
/// [`to_string`]: crate::string::ToString
|
||||||
|
|
|
@ -849,7 +849,8 @@ pub(crate) mod builtin {
|
||||||
/// assert_eq!(display, debug);
|
/// assert_eq!(display, debug);
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// For more information, see the documentation in [`std::fmt`].
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax, and further information.
|
||||||
///
|
///
|
||||||
/// [`Display`]: crate::fmt::Display
|
/// [`Display`]: crate::fmt::Display
|
||||||
/// [`Debug`]: crate::fmt::Debug
|
/// [`Debug`]: crate::fmt::Debug
|
||||||
|
|
|
@ -8,8 +8,8 @@ tests. `panic!` is closely tied with the `unwrap` method of both
|
||||||
[`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call
|
[`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call
|
||||||
`panic!` when they are set to [`None`] or [`Err`] variants.
|
`panic!` when they are set to [`None`] or [`Err`] variants.
|
||||||
|
|
||||||
When using `panic!()` you can specify a string payload, that is built using
|
When using `panic!()` you can specify a string payload that is built using
|
||||||
the [`format!`] syntax. That payload is used when injecting the panic into
|
[formatting syntax]. That payload is used when injecting the panic into
|
||||||
the calling Rust thread, causing the thread to panic entirely.
|
the calling Rust thread, causing the thread to panic entirely.
|
||||||
|
|
||||||
The behavior of the default `std` hook, i.e. the code that runs directly
|
The behavior of the default `std` hook, i.e. the code that runs directly
|
||||||
|
@ -18,6 +18,7 @@ after the panic is invoked, is to print the message payload to
|
||||||
call. You can override the panic hook using [`std::panic::set_hook()`].
|
call. You can override the panic hook using [`std::panic::set_hook()`].
|
||||||
Inside the hook a panic can be accessed as a `&dyn Any + Send`,
|
Inside the hook a panic can be accessed as a `&dyn Any + Send`,
|
||||||
which contains either a `&str` or `String` for regular `panic!()` invocations.
|
which contains either a `&str` or `String` for regular `panic!()` invocations.
|
||||||
|
(Whether a particular invocation contains the payload at type `&str` or `String` is unspecified and can change.)
|
||||||
To panic with a value of another other type, [`panic_any`] can be used.
|
To panic with a value of another other type, [`panic_any`] can be used.
|
||||||
|
|
||||||
See also the macro [`compile_error!`], for raising errors during compilation.
|
See also the macro [`compile_error!`], for raising errors during compilation.
|
||||||
|
@ -55,7 +56,7 @@ For more detailed information about error handling check out the [book] or the
|
||||||
[`panic_any`]: ../std/panic/fn.panic_any.html
|
[`panic_any`]: ../std/panic/fn.panic_any.html
|
||||||
[`Box`]: ../std/boxed/struct.Box.html
|
[`Box`]: ../std/boxed/struct.Box.html
|
||||||
[`Any`]: crate::any::Any
|
[`Any`]: crate::any::Any
|
||||||
[`format!`]: ../std/macro.format.html
|
[`format!` syntax]: ../std/fmt/index.html
|
||||||
[book]: ../book/ch09-00-error-handling.html
|
[book]: ../book/ch09-00-error-handling.html
|
||||||
[`std::result`]: ../std/result/index.html
|
[`std::result`]: ../std/result/index.html
|
||||||
|
|
||||||
|
@ -64,6 +65,29 @@ For more detailed information about error handling check out the [book] or the
|
||||||
If the main thread panics it will terminate all your threads and end your
|
If the main thread panics it will terminate all your threads and end your
|
||||||
program with code `101`.
|
program with code `101`.
|
||||||
|
|
||||||
|
# Editions
|
||||||
|
|
||||||
|
Behavior of the panic macros changed over editions.
|
||||||
|
|
||||||
|
## 2021 and later
|
||||||
|
|
||||||
|
In Rust 2021 and later, `panic!` always requires a format string and
|
||||||
|
the applicable format arguments, and is the same in `core` and `std`.
|
||||||
|
Use [`std::panic::panic_any(x)`](../std/panic/fn.panic_any.html) to
|
||||||
|
panic with an arbitrary payload.
|
||||||
|
|
||||||
|
## 2018 and 2015
|
||||||
|
|
||||||
|
In Rust Editions prior to 2021, `std::panic!(x)` with a single
|
||||||
|
argument directly uses that argument as a payload.
|
||||||
|
This is true even if the argument is a string literal.
|
||||||
|
For example, `panic!("problem: {reason}")` panics with a
|
||||||
|
payload of literally `"problem: {reason}"` (a `&'static str`).
|
||||||
|
|
||||||
|
`core::panic!(x)` with a single argument requires that `x` be `&str`,
|
||||||
|
but otherwise behaves like `std::panic!`. In particular, the string
|
||||||
|
need not be a literal, and is not interpreted as a format string.
|
||||||
|
|
||||||
# Examples
|
# Examples
|
||||||
|
|
||||||
```should_panic
|
```should_panic
|
||||||
|
|
|
@ -41,6 +41,9 @@ macro_rules! panic {
|
||||||
/// Use `print!` only for the primary output of your program. Use
|
/// Use `print!` only for the primary output of your program. Use
|
||||||
/// [`eprint!`] instead to print error and progress messages.
|
/// [`eprint!`] instead to print error and progress messages.
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// [flush]: crate::io::Write::flush
|
/// [flush]: crate::io::Write::flush
|
||||||
/// [`println!`]: crate::println
|
/// [`println!`]: crate::println
|
||||||
/// [`eprint!`]: crate::eprint
|
/// [`eprint!`]: crate::eprint
|
||||||
|
@ -103,6 +106,9 @@ macro_rules! print {
|
||||||
/// Use `println!` only for the primary output of your program. Use
|
/// Use `println!` only for the primary output of your program. Use
|
||||||
/// [`eprintln!`] instead to print error and progress messages.
|
/// [`eprintln!`] instead to print error and progress messages.
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// [`std::fmt`]: crate::fmt
|
/// [`std::fmt`]: crate::fmt
|
||||||
/// [`eprintln!`]: crate::eprintln
|
/// [`eprintln!`]: crate::eprintln
|
||||||
/// [lock]: crate::io::Stdout
|
/// [lock]: crate::io::Stdout
|
||||||
|
@ -150,6 +156,9 @@ macro_rules! println {
|
||||||
/// [`io::stderr`]: crate::io::stderr
|
/// [`io::stderr`]: crate::io::stderr
|
||||||
/// [`io::stdout`]: crate::io::stdout
|
/// [`io::stdout`]: crate::io::stdout
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
///
|
///
|
||||||
/// Panics if writing to `io::stderr` fails.
|
/// Panics if writing to `io::stderr` fails.
|
||||||
|
@ -181,6 +190,9 @@ macro_rules! eprint {
|
||||||
/// Use `eprintln!` only for error and progress messages. Use `println!`
|
/// Use `eprintln!` only for error and progress messages. Use `println!`
|
||||||
/// instead for the primary output of your program.
|
/// instead for the primary output of your program.
|
||||||
///
|
///
|
||||||
|
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
|
||||||
|
/// for details of the macro argument syntax.
|
||||||
|
///
|
||||||
/// [`io::stderr`]: crate::io::stderr
|
/// [`io::stderr`]: crate::io::stderr
|
||||||
/// [`io::stdout`]: crate::io::stdout
|
/// [`io::stdout`]: crate::io::stdout
|
||||||
/// [`println!`]: crate::println
|
/// [`println!`]: crate::println
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue