1 个不稳定版本
0.1.0 | 2019年12月17日 |
---|
#11 in #termination
16KB
166 行
log-termination
为您的 fn main() -> Result<(), Box<dyn Error>>
提供 proc宏属性,该属性将返回的错误发送到 log::error!
。
#![feature(try_trait)]
#![feature(termination_trait_lib)]
use log_termination::log_termination;
#[log_termination]
fn main() -> Result<(), Box<dyn std::error::Error>> {
// set up logging, e.g. fern
std::fs::metadata("non-existing-file")?;
// will call log::error!("No such file or directory (os error 2)") before exiting
}
lib.rs
:
这个属性proc宏应该应用于形式为 main() -> Result<(), Box<dyn Error>>
的main函数;它将返回值封装在一个实现 Termination
的新类型中,并通过 error!
显示返回的错误。此宏纯粹是为了方便。
您的项目需要 try_trait
和 termination_trait_lib
功能。
例如
#![feature(try_trait)]
#![feature(termination_trait_lib)]
use std::error::Error;
use std::io::ErrorKind;
#[macro_use]
extern crate log;
extern crate fern;
extern crate log_termination;
use log_termination::log_termination;
#[log_termination]
fn main() -> Result<(), Box<dyn Error>> {
fern::Dispatch::new()
.format(|o, m, r| { o.finish(format_args!(
"[{}:{}] {} {}: {}",
r.file().unwrap(),
r.line().unwrap(),
chrono::Local::now().format("%F %T"),
r.level(),
m
))})
.level(log::LevelFilter::Error)
.chain(std::io::stderr())
.apply()?;
return Err(Box::new(std::io::Error::new(ErrorKind::Other, "SNAFU")));
// This code is valid, but unreachable:
//Ok(())
}
依赖关系
~3.5–5MB
~98K SLoC