Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何写恐慌!像生锈的宏?_Rust - Fatal编程技术网

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
或者什么。