Rust 如何写恐慌!像生锈的宏?
对于致命错误处理,我使用的是Rust 如何写恐慌!像生锈的宏?,rust,Rust,对于致命错误处理,我使用的是panic宏,但我更希望宏不打印文件/行信息,只打印错误消息 我读过,但我的理解有点动摇 我看了看恐慌的根源宏,但它调用函数来完成它的工作,其中文件和行信息是操作的一个组成部分,所以我不能对此进行调整 我看了看println宏,这看起来更有希望,但我有两个问题不知道如何解决 macro_rules! die { () => (print!("\n")); ($fmt:expr) => (print!(concat!($fmt, "\n"))
panic代码>宏,但我更希望宏不打印文件/行信息,只打印错误消息
我读过,但我的理解有点动摇
我看了看恐慌的根源代码>宏,但它调用函数来完成它的工作,其中文件和行信息是操作的一个组成部分,所以我不能对此进行调整
我看了看println代码>宏,这看起来更有希望,但我有两个问题不知道如何解决
macro_rules! die {
() => (print!("\n"));
($fmt:expr) => (print!(concat!($fmt, "\n")));
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*); exit(-1));
}
如果我像在最后一行一样,将exit()
调用放入,则在尝试调用它时会出现语法错误
如果我删除exit()
,我不会收到有关宏的投诉,但此代码无法编译:
let file = match File::open(&path) {
Err(why) => die!("Couldn't open {}: {}", display, why.description()),
Ok(file) => file,
};
然而,当死亡时,它会编译代码>被替换为panic代码>。我想恐慌是有魔力的代码>它告诉编译器它永远不会返回
首先,如果我像在最后一行一样,将exit()
这是因为宏应该扩展为单个项,而在这里它扩展为两个项。您只需将调用包装在块{}
中,它就可以正常工作了。。。一旦您确认调用退出
({ print!(concat!($fmt, "\n"), $($arg)*); std::process::exit(-1) });
如果我删除exit()
,我不会收到有关宏的投诉,但此代码无法编译。而当die
替换为panic
时,它会编译。我假设panic
有一种魔力,它告诉编译器它永远不会返回
它不像<代码>那么神奇代码>类型。panic
和exit
功能都返回
是一个没有值的类型:它永远无法构造
这足以让编译器知道这些函数永远不会返回(它们会发散),因此从类型检查的角度来看,代码>被视为所有类型的子类型,不会引起问题
首先,如果我像在最后一行一样,将exit()
这是因为宏应该扩展为单个项,而在这里它扩展为两个项。您只需将调用包装在块{}
中,它就可以正常工作了。。。一旦您确认调用退出
({ print!(concat!($fmt, "\n"), $($arg)*); std::process::exit(-1) });
如果我删除exit()
,我不会收到有关宏的投诉,但此代码无法编译。而当die
替换为panic
时,它会编译。我假设panic
有一种魔力,它告诉编译器它永远不会返回
它不像<代码>那么神奇代码>类型。panic
和exit
功能都返回
是一个没有值的类型:它永远无法构造
这足以让编译器知道这些函数永远不会返回(它们会发散),因此从类型检查的角度来看,
被认为是所有类型的子类型,不会引起问题。我在尝试调用它时会出现语法错误-很遗憾,您没有显示任何这些错误。此代码无法编译-太糟糕了,你没有显示它是如何失败的。我第二个@Shepmaster,请提供一个,我必须猜测要引入哪些类型/特征,切换到路径而不是显示,等等。。。让你的例子在修复后编译。是的,我看到的第一个错误是exit
不在范围内,所以现在我不得不猜测OP是否有自己的exit
或者什么。我在尝试调用它时遇到语法错误-很遗憾你没有显示任何这些错误。此代码无法编译-太糟糕了,你没有显示它是如何失败的。我第二个@Shepmaster,请提供一个,我必须猜测要引入哪些类型/特征,切换到路径而不是显示,等等。。。为了让您的示例在修复后进行编译。是的,我看到的第一个错误是exit
不在范围内,所以现在我不得不猜测OP是否有自己的exit
或者什么。