On this page
Struct std::process::ExitCode
pub struct ExitCode(/* private fields */);
This type represents the status code the current process can return to its parent under normal termination.
ExitCode is intended to be consumed only by the standard library (via Termination::report()), and intentionally does not provide accessors like PartialEq, Eq, or Hash. Instead the standard library provides the canonical SUCCESS and FAILURE exit codes as well as From<u8> for ExitCode for constructing other arbitrary exit codes.
Portability
Numeric values used in this type don’t have portable meanings, and different platforms may mask different amounts of them.
For the platform’s canonical successful and unsuccessful codes, see the SUCCESS and FAILURE associated items.
Differences from ExitStatus
ExitCode is intended for terminating the currently running process, via the Termination trait, in contrast to ExitStatus, which represents the termination of a child process. These APIs are separate due to platform compatibility differences and their expected usage; it is not generally possible to exactly reproduce an ExitStatus from a child for the current process after the fact.
Examples
ExitCode can be returned from the main function of a crate, as it implements Termination:
use std::process::ExitCode;
fn main() -> ExitCode {
if !check_foo() {
return ExitCode::from(42);
}
ExitCode::SUCCESS
}
Implementations
impl ExitCode
pub const SUCCESS: ExitCode = _
The canonical ExitCode for successful termination on this platform.
Note that a ()-returning main implicitly results in a successful termination, so there’s no need to return this from main unless you’re also returning other possible codes.
pub const FAILURE: ExitCode = _
The canonical ExitCode for unsuccessful termination on this platform.
If you’re only returning this and SUCCESS from main, consider instead returning Err(_) and Ok(()) respectively, which will return the same codes (but will also eprintln! the error).
pub fn exit_process(self) -> !
exitcode_exit_method #97100)
Exit the current process with the given ExitCode.
Note that this has the same caveats as process::exit(), namely that this function terminates the process immediately, so no destructors on the current stack or any other thread’s stack will be run. If a clean shutdown is needed, it is recommended to simply return this ExitCode from the main function, as demonstrated in the type documentation.
Differences from process::exit()
process::exit() accepts any i32 value as the exit code for the process; however, there are platforms that only use a subset of that value (see process::exit platform-specific behavior). ExitCode exists because of this; only ExitCodes that are supported by a majority of our platforms can be created, so those problems don’t exist (as much) with this method.
Examples
#![feature(exitcode_exit_method)]
// there's no way to gracefully recover from an UhOhError, so we just
// print a message and exit
fn handle_unrecoverable_error(err: UhOhError) -> ! {
eprintln!("UH OH! {err}");
let code = match err {
UhOhError::GenericProblem => ExitCode::FAILURE,
UhOhError::Specific => ExitCode::from(3),
UhOhError::WithCode { exit_code, .. } => exit_code,
};
code.exit_process()
}
Trait Implementations
impl Clone for ExitCode
fn clone(&self) -> ExitCode
fn clone_from(&mut self, source: &Self)
source. Read more
impl Debug for ExitCode
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl Default for ExitCode
The default value is ExitCode::SUCCESS
impl ExitCodeExt for ExitCodeAvailable on Windows only.
fn from_raw(raw: u32) -> Self
windows_process_exit_code_from)
impl From<u8> for ExitCode
fn from(code: u8) -> Self
Construct an ExitCode from an arbitrary u8 value.
impl Termination for ExitCode
fn report(self) -> ExitCode
impl Copy for ExitCode
Auto Trait Implementations
impl RefUnwindSafe for ExitCode
impl Send for ExitCode
impl Sync for ExitCode
impl Unpin for ExitCode
impl UnwindSafe for ExitCode
Blanket Implementations
impl<T> Any for T
where
T: 'static + ?Sized,
impl<T> Borrow<T> for T
where
T: ?Sized,
impl<T> BorrowMut<T> for T
where
T: ?Sized,
impl<T> From<T> for T
fn from(t: T) -> T
Returns the argument unchanged.
impl<T, U> Into<U> for T
where
U: From<T>,
fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of From<T> for U chooses to do.
impl<T> ToOwned for T
where
T: Clone,
type Owned = T
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)
impl<T, U> TryFrom<U> for T
where
U: Into<T>,
type Error = Infallible
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for T
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/process/struct.ExitCode.html