Ana*_*Ana 0 exception-handling try-catch rust
看来,?和catch已被接受为锈,但我不能够正确地使用它:
let x = catch {
1
}
Run Code Online (Sandbox Code Playgroud)
我想这应该给我Ok(1).相反,我得到错误:
error: expected identifier, found `1`
--> src/main.rs:15:9
|
15 | 1
| ^
Run Code Online (Sandbox Code Playgroud)
Rust中还没有支持这种语法,还是我的代码有问题?
TL; DR:RFC已被接受,但您的语法略有偏差(不幸的是)并且该功能仍然是门控的.
请参阅Alec关于如何实际使用的优秀答案catch.
我鼓励您阅读完整的错误日志:
Run Code Online (Sandbox Code Playgroud)error: expected identifier, found `1` --> <anon>:2:21 | 2 | let x = catch { 1 }; | ^ error[E0422]: cannot find struct, variant or union type `catch` in this scope --> <anon>:2:13 | 2 | let x = catch { 1 }; | ^^^^^ not found in this scope error: aborting due to 2 previous errors
线索在第二条错误消息中:
catch在此范围内找不到struct,variant或union类型
这真的让我们知道catch编译器没有将其识别为关键字.
由于catch看起来像任何常规单词,所发生的是编译器尝试将其解析为构建struct或enum.实际上,构建struct或的语法enum是:
struct X { name: i32 }
let x = X { name: 1 };
Run Code Online (Sandbox Code Playgroud)
因此,编译器会看到<identifier> {并期望它后跟一个列表<identifier>: <expression>.它读取1(不是标识符)并报告不是标识符的错误1.
这听起来很愚蠢,因为它有点儿.你需要拥有
#![feature(catch_expr)]
fn main() {
let x = do catch {
1
};
}
Run Code Online (Sandbox Code Playgroud)
基本上,catch一样default并且union,不能进行关键字而不破坏向后兼容性.由于Rust已经尝试保证1.x上的任何代码仍然可以在1.y上运行,因此引入default,union现在catch进入语法一直都是要弄清楚冲突.对于union和default,没有 - 在这些职位中从不期望标识符.
对于catch,catch { 1 }也可以解释为struct literal.除非您需要do(保留关键字)之前发生catch- 否则没有歧义.是的,这很难看,每个人都知道.
希望这些噩梦在2.0出现时消失,我们可以打破向后兼容性.引用围绕语法问题catch的rust-internals讨论:
我们最终希望以这种方式重新调整其他语法的列表越来越多,但我们通常会避免破坏在1.y上运行1.x的代码的能力,其中y> x,除非代码正在利用a编译器错误或只是一个非常罕见的结构.我们的稳定性保证了我们要求大多数人等到2.0.