Coder Social home page Coder Social logo

Comments (4)

dtolnay avatar dtolnay commented on July 19, 2024 3

You could make a macro that captures both in one call:

use anyhow::{bail, Context, Result};

macro_rules! here {
    () => {
        concat!("at ", file!(), " line ", line!(), " column ", column!())
    };
}

fn f() -> Result<()> {
    bail!("oh no!");
}

fn main() -> Result<()> {
    f().context(here!())?;
    Ok(())
}
Error: at src/main.rs line 14 column 17

Caused by:
    oh no!

Or get a little fancier with an extension trait:

use anyhow::{bail, Context, Result};
use std::fmt::Display;

pub struct Location {
    file: &'static str,
    line: u32,
    column: u32,
}

pub trait ErrorLocation<T, E> {
    fn location(self, loc: &'static Location) -> Result<T>;
}

impl<T, E> ErrorLocation<T, E> for Result<T, E>
where
    E: Display,
    Result<T, E>: Context<T, E>,
{
    fn location(self, loc: &'static Location) -> Result<T> {
        let msg = self.as_ref().err().map(ToString::to_string);
        self.with_context(|| format!(
            "{} at {} line {} column {}",
            msg.unwrap(), loc.file, loc.line, loc.column,
        ))
    }
}

macro_rules! here {
    () => {
        &Location {
            file: file!(),
            line: line!(),
            column: column!(),
        }
    };
}

fn f() -> Result<()> {
    bail!("oh no!");
}

fn main() -> Result<()> {
    f().location(here!())?;
    Ok(())
}

from anyhow.

ibaryshnikov avatar ibaryshnikov commented on July 19, 2024

No way to go without a macro, I guess? Well, even like this, it's almost perfect :) Do you plan adding such macro to a crate itself?

from anyhow.

est31 avatar est31 commented on July 19, 2024

std errors will contain backtraces in the future: rust-lang/rust#53487

from anyhow.

ibaryshnikov avatar ibaryshnikov commented on July 19, 2024

I'll stick with macro then, until the backtrace in std is usable. Thanks @dtolnay @est31 !

from anyhow.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.