
285
5
장
도구 활용
TryFrom
<
i32
>
을 잊기 쉽기 때문이다.
매크로는 호출 지점에 코드를 생성하므로 추가 진단 정보를 자동으로 생성할 때도 활용할 수
있다. 특히, 표준 라이브러리의
file
!()
과
line
!()
매크로를 사용하면 소스 코드 위치 정보
를 출력할 수 있다.
macro_rules! log_failure {
{ $e:expr } => {
{
let result = $e;
if let Err(err) = &result {
eprintln!("{}:{}: operation '{}' failed: {:?}",
file!(),
line!(),
stringify!($e),
err);
}
result
}
}
}
오류가 발생하면 문제가 되는 항목과 위치에 대한 세부 정보가 로그 파일에 자동으로 기록
된다.
use std::convert::TryInto;
let x: Result<u8, _> = log_failure!(512.try_into()); // `u8`을 담기에는 너무 크다.
let y = log_failure!(std::str::from_utf8(b"\xc3\x28")); // 잘못된 UTF-8
src/main.rs:340: operation '512.try_into()' failed: TryFromIntError(())
src/main.rs:341: ...