Location

Struct Location 

1.10.0 ยท Source
pub struct Location<'a> { /* private fields */ }
Expand description

A struct containing information about the location of a panic.

This structure is created by PanicHookInfo::location() and PanicInfo::location().

ยงExamples

โ“˜
use std::panic;

panic::set_hook(Box::new(|panic_info| {
    if let Some(location) = panic_info.location() {
        println!("panic occurred in file '{}' at line {}", location.file(), location.line());
    } else {
        println!("panic occurred but can't get location information...");
    }
}));

panic!("Normal panic");

ยงComparisons

Comparisons for equality and ordering are made in file, line, then column priority. Files are compared as strings, not Path, which could be unexpected. See Location::fileโ€™s documentation for more discussion.

Implementationsยง

Sourceยง

impl<'a> Location<'a>

1.46.0 (const: 1.79.0) ยท Source

pub const fn caller() -> &'static Location<'static>

Returns the source location of the caller of this function. If that functionโ€™s caller is annotated then its call location will be returned, and so on up the stack to the first call within a non-tracked function body.

ยงExamples
use std::panic::Location;

/// ```
///      |1        |11       |21       |31       |41
///    +-|---------|---------|---------|---------|--------
/// 15 | #[track_caller]
/// 16 | fn new_location() -> &'static Location<'static> {
/// 17 |     Location::caller()
///    |     ------------------| the value of this expression depends on the caller,
///    |                       | since the function is marked #[track_caller]
/// 18 | }
/// ```
#[track_caller]
fn new_location() -> &'static Location<'static> {
    Location::caller()
}

/// ```
///      |1  |5    |11       |21       |31       |41       |51
///    +-|---|-----|---------|---------|---------|---------|---
/// 29 | fn constant_location() -> &'static Location<'static> {
/// 30 |     new_location()
///    |     ^ any invocation of constant_location() points here,
///    |       no matter the location it is called from
/// 31 | }
/// ```
fn constant_location() -> &'static Location<'static> {
    new_location()
}

fn main() {
    //      |1  |5    |11       |21       |31       |41       |51
    //    +-|---|-----|---------|---------|---------|---------|---
    // 29 | fn constant_location() -> &'static Location<'static> {
    // 30 |     new_location()
    //    |     ^ `let constant` points here
    // 31 | }
    let constant = constant_location();
    assert_eq!(constant.file(), file!());
    assert_eq!((constant.line(), constant.column()), (30, 5));

    let constant_2 = constant_location();
    assert_eq!(
        (constant.file(), constant.line(), constant.column()),
        (constant_2.file(), constant_2.line(), constant_2.column())
    );

    //      |1        |11  |16  |21       |31
    //    +-|---------|----|----|---------|------
    // 55 |     let here = new_location();
    //    |                ^ `let here` points here, as `new_location()` is the callsite
    // 56 |     assert_eq!(here.file(), file!());
    let here = new_location();
    assert_eq!(here.file(), file!());
    assert_eq!((here.line(), here.column()), (55, 16));

    //      |1        |11       |21       ||32      |41       |51
    //    +-|---------|---------|---------||--------|---------|------
    // 64 |     let yet_another_location = new_location();
    //    |                                ^ `let yet_another_location` points here
    // 65 |     assert_eq!(here.file(), yet_another_location.file());
    let yet_another_location = new_location();
    assert_eq!(here.file(), yet_another_location.file());
    assert_ne!(
        (here.line(), here.column()),
        (yet_another_location.line(), yet_another_location.column())
    );
}
1.10.0 (const: 1.79.0) ยท Source

pub const fn file(&self) -> &'a str

Returns the name of the source file from which the panic originated.

ยง&str, not &Path

The returned name refers to a source path on the compiling system, but it isnโ€™t valid to represent this directly as a &Path. The compiled code may run on a different system with a different Path implementation than the system providing the contents and this library does not currently have a different โ€œhost pathโ€ type.

The most surprising behavior occurs when โ€œthe sameโ€ file is reachable via multiple paths in the module system (usually using the #[path = "..."] attribute or similar), which can cause what appears to be identical code to return differing values from this function.

ยงCross-compilation

This value is not suitable for passing to Path::new or similar constructors when the host platform and target platform differ.

ยงExamples
โ“˜
use std::panic;

panic::set_hook(Box::new(|panic_info| {
    if let Some(location) = panic_info.location() {
        println!("panic occurred in file '{}'", location.file());
    } else {
        println!("panic occurred but can't get location information...");
    }
}));

panic!("Normal panic");
1.92.0 (const: 1.92.0) ยท Source

pub const fn file_as_c_str(&self) -> &'a CStr

Returns the name of the source file as a nul-terminated CStr.

This is useful for interop with APIs that expect C/C++ __FILE__ or std::source_location::file_name, both of which return a nul-terminated const char*.

1.10.0 (const: 1.79.0) ยท Source

pub const fn line(&self) -> u32

Returns the line number from which the panic originated.

ยงExamples
โ“˜
use std::panic;

panic::set_hook(Box::new(|panic_info| {
    if let Some(location) = panic_info.location() {
        println!("panic occurred at line {}", location.line());
    } else {
        println!("panic occurred but can't get location information...");
    }
}));

panic!("Normal panic");
1.25.0 (const: 1.79.0) ยท Source

pub const fn column(&self) -> u32

Returns the column from which the panic originated.

ยงExamples
โ“˜
use std::panic;

panic::set_hook(Box::new(|panic_info| {
    if let Some(location) = panic_info.location() {
        println!("panic occurred at column {}", location.column());
    } else {
        println!("panic occurred but can't get location information...");
    }
}));

panic!("Normal panic");

Trait Implementationsยง

1.10.0 ยท Sourceยง

impl<'a> Clone for Location<'a>

Sourceยง

fn clone(&self) -> Location<'a>

Returns a duplicate of the value. Read more
1.0.0 ยท Sourceยง

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
1.10.0 ยท Sourceยง

impl Debug for Location<'_>

Sourceยง

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
1.26.0 ยท Sourceยง

impl Display for Location<'_>

Sourceยง

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
1.10.0 ยท Sourceยง

impl Hash for Location<'_>

Sourceยง

fn hash<H>(&self, state: &mut H)
where H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 ยท Sourceยง

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
1.10.0 ยท Sourceยง

impl Ord for Location<'_>

Sourceยง

fn cmp(&self, other: &Location<'_>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 ยท Sourceยง

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 ยท Sourceยง

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 ยท Sourceยง

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
1.10.0 ยท Sourceยง

impl PartialEq for Location<'_>

Sourceยง

fn eq(&self, other: &Location<'_>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 ยท Sourceยง

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
1.10.0 ยท Sourceยง

impl PartialOrd for Location<'_>

Sourceยง

fn partial_cmp(&self, other: &Location<'_>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 ยท Sourceยง

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 ยท Sourceยง

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 ยท Sourceยง

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 ยท Sourceยง

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
1.10.0 ยท Sourceยง

impl<'a> Copy for Location<'a>

1.10.0 ยท Sourceยง

impl Eq for Location<'_>

1.10.0 ยท Sourceยง

impl Send for Location<'_>

1.10.0 ยท Sourceยง

impl Sync for Location<'_>

Auto Trait Implementationsยง

ยง

impl<'a> Freeze for Location<'a>

ยง

impl<'a> RefUnwindSafe for Location<'a>

ยง

impl<'a> Unpin for Location<'a>

ยง

impl<'a> UnwindSafe for Location<'a>

Blanket Implementationsยง

Sourceยง

impl<T> Any for T
where T: 'static + ?Sized,

Sourceยง

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Sourceยง

impl<T> Borrow<T> for T
where T: ?Sized,

Sourceยง

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Sourceยง

impl<T> BorrowMut<T> for T
where T: ?Sized,

Sourceยง

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Sourceยง

impl<T> CloneToUninit for T
where T: Clone,

Sourceยง

unsafe fn clone_to_uninit(&self, dest: *mut u8)

๐Ÿ”ฌThis is a nightly-only experimental API. (clone_to_uninit #126799)
Performs copy-assignment from self to dest. Read more
Sourceยง

impl<T> From<T> for T

Sourceยง

fn from(t: T) -> T

Returns the argument unchanged.

Sourceยง

impl<T, U> Into<U> for T
where U: From<T>,

Sourceยง

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Sourceยง

impl<T> ToOwned for T
where T: Clone,

Sourceยง

type Owned = T

The resulting type after obtaining ownership.
Sourceยง

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Sourceยง

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Sourceยง

impl<T> ToString for T
where T: Display + ?Sized,

Sourceยง

fn to_string(&self) -> String

Converts the given value to a String. Read more
Sourceยง

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Sourceยง

type Error = Infallible

The type returned in the event of a conversion error.
Sourceยง

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Sourceยง

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Sourceยง

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Sourceยง

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.