Exception handling 如何使用?生锈了吗?

Exception handling 如何使用?生锈了吗?,exception-handling,rust,try-catch,Exception Handling,Rust,Try Catch,看起来,但我不能正确使用它: let x = catch { 1 } 我想这应该给我Ok(1)。相反,我得到了一个错误: 错误:应为标识符,找到`1` -->src/main.rs:15:9 | 15 | 1 | ^ Rust还不支持这种语法,还是我的代码有问题?TL;DR:RFC是可以接受的,但您的语法有点不正确(不幸的是),并且该功能仍然处于选通状态。 参见Alec关于如何实际使用catch的精彩回答 我建议您阅读完整的错误日志: 因此,编译器看

看起来,但我不能正确使用它:

let x = catch {
    1
}
我想这应该给我
Ok(1)
。相反,我得到了一个错误:

错误:应为标识符,找到`1`
-->src/main.rs:15:9
|
15 |         1
|         ^

Rust还不支持这种语法,还是我的代码有问题?

TL;DR:RFC是可以接受的,但您的语法有点不正确(不幸的是),并且该功能仍然处于选通状态。

参见Alec关于如何实际使用
catch
的精彩回答


我建议您阅读完整的错误日志:


因此,编译器看到
{
并希望它后面跟着一个
列表。它读取
1
,这不是标识符,并报告错误,即
1
不是标识符。

TL;DR:RFC被接受,但您的语法有点不正确(不幸的是)而且该功能仍处于选通状态。

参见Alec关于如何实际使用
catch
的精彩回答


我建议您阅读完整的错误日志:


因此,编译器看到
{
并希望它后面跟着一列
。它读取
1
,这不是一个标识符,并报告
1
不是标识符的错误。

这听起来非常愚蠢,因为它有点像。你需要

#![feature(catch_expr)]

fn main() {
    let x = do catch {
        1
    };
}
基本上,
catch
,比如
default
union
,如果不破坏向后兼容性,就不能成为关键字。因为Rust试图保证1.x上的任何代码在1.y上仍然有效,所以引入了
default
union
,现在语法中的
catch
都是关于fig的消除冲突。对于
联合
默认
,没有-在这些位置不需要标识符

对于
catch
catch{1}
也可以解释为结构文字。除非您要求
do
(保留关键字)出现在
catch
之前,否则没有歧义。是的,这很难看,每个人都知道

希望当2.0出现时,这些噩梦会消失,我们可以打破向后兼容性。引自:

有越来越多的其他语法我们最终希望以这种方式重新调整用途,但我们通常避免破坏在1.x on 1.y上运行代码的能力,其中y>x,除非代码利用了编译器错误或只是一个非常罕见的构造。我们的稳定性保证要求我们等到2.0时才运行m其中大部分


这听起来很蠢,因为它有点蠢。你需要

#![feature(catch_expr)]

fn main() {
    let x = do catch {
        1
    };
}
基本上,
catch
,比如
default
union
,如果不破坏向后兼容性,就不能成为关键字。因为Rust试图保证1.x上的任何代码在1.y上仍然有效,所以引入了
default
union
,现在语法中的
catch
都是关于fig的消除冲突。对于
联合
默认
,没有-在这些位置不需要标识符

对于
catch
catch{1}
也可以解释为结构文字。除非您要求
do
(保留关键字)出现在
catch
之前,否则没有歧义。是的,这很难看,每个人都知道

希望当2.0出现时,这些噩梦会消失,我们可以打破向后兼容性。引自:

有越来越多的其他语法我们最终希望以这种方式重新调整用途,但我们通常避免破坏在1.x on 1.y上运行代码的能力,其中y>x,除非代码利用了编译器错误或只是一个非常罕见的构造。我们的稳定性保证要求我们等到2.0时才运行m其中大部分


事实上,目前语言中只有问号运算符。该链接仅指向RFC。大多数人很可能不想使用
catch
。在我看来,这不太可能是常用的。我建议你接受Alec的答案,而不是我的:解释错误消息为什么很酷和有趣所有,但解释如何实际使用
catch
可能更有用:)尽管没有压力,您可以自由地接受任何您想要的答案。这是Rust编译器的问题,因为它无法输出正确的错误消息。实际上,目前该语言中只有问号运算符。该链接仅指向RFC.Chances很好,因为大多数人无论如何都不想使用
catch
。在我看来,它不太可能是一种常用的东西。我建议你接受Alec的答案,而不是我的答案:解释为什么错误消息很酷,但解释如何实际使用
catch
,可能更有用:)不过没有压力,而且你可以自由地接受任何你想接受的答案。这是Rust编译器的问题,因为它无法输出正确的错误消息。当2.0出现时——没有关于Rust 2.0的计划,甚至有人可能会说有反计划——没有人会因为不愿意在Rust目标。@Shepmaster我希望你是错的。:)TBH,对于很多这样的更改,实际上很少有代码会中断-问题是人们可以想象代码可能会中断。从长远来看,让
联合
成为一个关键字可能是一个非常好的主意-但这应该是一个非常缓慢的过程。首先是警告“
union
将成为一个关键字,不要将其用作变量”,然后是一个可以用标志禁用的错误,最后是一个硬错误。否则,Rust的语法将与C++的语法相同。由于前面的注释已做出,请继续
#![feature(catch_expr)]

fn main() {
    let x = do catch {
        1
    };
}