use #[track_caller] and Location

This commit is contained in:
Harald Hoyer 2020-08-28 16:45:24 +02:00
parent e2815321bc
commit 356335e807
Signed by: harald
GPG key ID: 900F3C4971086004
21 changed files with 515 additions and 548 deletions

View file

@ -2,7 +2,7 @@ use std::error::Error;
use std::io;
use std::result::Result;
use chainerror::*;
use chainerror::prelude::v1::*;
fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
Err(io::Error::from(io::ErrorKind::NotFound))?;
@ -11,14 +11,14 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
fn func3() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
do_some_io().cherr(format!("Error reading '{}'", filename))?;
Ok(())
}
derive_str_cherr!(Func2Error);
fn func2() -> ChainResult<(), Func2Error> {
func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
func3().cherr(Func2Error(format!("func2 error: calling func3")))?;
Ok(())
}
@ -43,9 +43,9 @@ impl ::std::fmt::Debug for Func1Error {
}
fn func1() -> ChainResult<(), Func1Error> {
func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
func2().cherr(Func1Error::Func2)?;
let filename = String::from("bar.txt");
do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
do_some_io().cherr(Func1Error::IO(filename))?;
Ok(())
}
@ -68,5 +68,7 @@ fn main() {
}
eprintln!("\nDebug Error:\n{:?}", e);
eprintln!("\nAlternative Debug Error:\n{:#?}", e);
}
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -12,7 +12,7 @@ derive_str_cherr!(Func2Error);
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
do_some_io().cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
@ -33,9 +33,9 @@ impl ::std::fmt::Display for Func1ErrorKind {
impl ::std::error::Error for Func1ErrorKind {}
fn func1() -> ChainResult<(), Func1ErrorKind> {
func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
func2().cherr(Func1ErrorKind::Func2)?;
let filename = String::from("bar.txt");
do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?;
do_some_io().cherr(Func1ErrorKind::IO(filename))?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -12,7 +12,7 @@ derive_str_cherr!(Func2Error);
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
do_some_io().cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
@ -39,9 +39,9 @@ impl ::std::fmt::Debug for Func1ErrorKind {
impl ::std::error::Error for Func1ErrorKind {}
fn func1() -> ChainResult<(), Func1ErrorKind> {
func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
func2().cherr(Func1ErrorKind::Func2)?;
let filename = String::from("bar.txt");
do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?;
do_some_io().cherr(Func1ErrorKind::IO(filename))?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -12,7 +12,7 @@ derive_str_cherr!(Func2Error);
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
do_some_io().cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
@ -39,9 +39,9 @@ impl ::std::fmt::Debug for Func1ErrorKind {
impl ::std::error::Error for Func1ErrorKind {}
fn func1() -> ChainResult<(), Func1ErrorKind> {
func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
func2().cherr(Func1ErrorKind::Func2)?;
let filename = String::from("bar.txt");
do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?;
do_some_io().cherr(Func1ErrorKind::IO(filename))?;
Ok(())
}

View file

@ -1,5 +1,5 @@
pub mod mycrate {
use chainerror::*;
use chainerror::prelude::v1::*;
use std::io;
fn do_some_io() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sync>> {
@ -11,7 +11,7 @@ pub mod mycrate {
fn func2() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
do_some_io().cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
@ -35,9 +35,9 @@ pub mod mycrate {
}
pub fn func1() -> Result<()> {
func2().map_err(|e| cherr!(e, ErrorKind::Func2))?;
func2().cherr(ErrorKind::Func2)?;
let filename = String::from("bar.txt");
do_some_io().map_err(|e| cherr!(e, ErrorKind::IO(filename)))?;
do_some_io().cherr(ErrorKind::IO(filename))?;
Ok(())
}
}

View file

@ -1,7 +1,7 @@
pub mod mycrate {
use std::io;
use chainerror::*;
use chainerror::prelude::v1::*;
fn do_some_io(_f: &str) -> std::result::Result<(), io::Error> {
Err(io::Error::from(io::ErrorKind::NotFound))?;
@ -12,8 +12,7 @@ pub mod mycrate {
fn func2() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io(filename)
.map_err(|e| cherr!(e, Func2Error(format!("Error reading '{}'", filename))))?;
do_some_io(filename).cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
@ -82,21 +81,19 @@ pub mod mycrate {
}
pub fn func1() -> Result<()> {
func2().map_err(|e| cherr!(e, ErrorKind::from(&e)))?;
func2().map_err(|e| ErrorKind::from(&e))?;
let filename = "bar.txt";
do_some_io(filename)
.map_err(|e| cherr!(e, ErrorKind::from_io_error(&e, filename.into())))?;
do_some_io(filename).map_err(|e| cherr!(e, ErrorKind::IO(filename.into())))?;
do_some_io(filename).map_err(|e| cherr!(e, ErrorKind::from(&e)))?;
do_some_io(filename).map_err(minto_cherr!(ErrorKind))?;
do_some_io(filename).map_cherr(|e| ErrorKind::from_io_error(&e, filename.into()))?;
do_some_io(filename).map_cherr(|_| ErrorKind::IO(filename.into()))?;
do_some_io(filename).map_cherr(|e| ErrorKind::from(e))?;
Ok(())
}
pub fn super_func1() -> Result<()> {
func1().map_err(minto_cherr!(ErrorKind))?;
func1().map_cherr(|e| ErrorKind::from(e))?;
Ok(())
}
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
@ -11,14 +11,14 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
if let Err(e) = do_some_io() {
Err(cherr!(e, "func2 error"))?;
Err(e).cherr("func2 error")?;
}
Ok(())
}
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
if let Err(e) = func2() {
Err(cherr!(e, "func1 error"))?;
Err(e).cherr("func1 error")?;
}
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
@ -10,12 +10,12 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
}
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
do_some_io().map_err(|e| cherr!(e, "func2 error"))?;
do_some_io().cherr("func2 error")?;
Ok(())
}
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
func2().map_err(|e| cherr!(e, "func1 error"))?;
func2().cherr("func1 error")?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -10,12 +10,12 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
do_some_io().cherr(format!("Error reading '{}'", filename))?;
Ok(())
}
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
func2().map_err(mstrerr!("func1 error"))?;
func2().cherr("func1 error")?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -10,7 +10,7 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
do_some_io().cherr(format!("Error reading '{}'", filename))?;
Ok(())
}
@ -18,7 +18,7 @@ fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
if let Err(e) = func2() {
if let Some(s) = e.source() {
eprintln!("func2 failed because of '{}'", s);
Err(e).map_err(mstrerr!("func1 error"))?;
Err(e).cherr("func1 error")?;
}
}
Ok(())

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -10,12 +10,12 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
do_some_io().cherr(format!("Error reading '{}'", filename))?;
Ok(())
}
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
func2().map_err(mstrerr!("func1 error"))?;
func2().cherr("func1 error")?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -10,12 +10,12 @@ fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
do_some_io().cherr(format!("Error reading '{}'", filename))?;
Ok(())
}
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
func2().map_err(mstrerr!("func1 error"))?;
func2().cherr(format!("func1 error"))?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -12,14 +12,14 @@ derive_str_cherr!(Func2Error);
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
do_some_io().cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
derive_str_cherr!(Func1Error);
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
func2().cherr(Func1Error(format!("func1 error")))?;
Ok(())
}

View file

@ -1,4 +1,4 @@
use chainerror::*;
use chainerror::prelude::v1::*;
use std::error::Error;
use std::io;
use std::result::Result;
@ -12,7 +12,7 @@ derive_str_cherr!(Func2Error);
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
let filename = "foo.txt";
do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
do_some_io().cherr(Func2Error(format!("Error reading '{}'", filename)))?;
Ok(())
}
@ -20,9 +20,9 @@ derive_str_cherr!(Func1ErrorFunc2);
derive_str_cherr!(Func1ErrorIO);
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
func2().map_err(mstrerr!(Func1ErrorFunc2, "func1 error calling func2"))?;
func2().cherr(Func1ErrorFunc2(format!("func1 error calling func2")))?;
let filename = "bar.txt";
do_some_io().map_err(mstrerr!(Func1ErrorIO, "Error reading '{}'", filename))?;
do_some_io().cherr(Func1ErrorIO(format!("Error reading '{}'", filename)))?;
Ok(())
}