首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一次Rust重写基础软件实践(三)

有读者可能会问:既然 Rust 定义了 Unrecoverable Errors, 那就是不可恢复错误,我为什么还固执需要处理这种错误呢?回答这个问题还是需要结合我场景来讨论。...std::panic::catch_unwind 主要是通过调用一个闭包来捕获在其中可能发生 panic 错误。...为什么该闭包中必须是不可变变量,原因与该闭包传入数据类型可能实现 UnwindSafe trait 相关,读者可以去了解需要实现该 trait 数据类型,本例中是 &i32。...其次,如果该闭包调用需要返回信息给外部使用,那么可以将返回信息放入调用返回值中,如上代码所示第一个闭包调用返回 result_value 会被紧接 match 代码所使用。...最后是一个建议,当使用该闭包时候请包含尽量少逻辑代码来实现 panic 错误捕获,这样可以控制传入数据类型(受闭包调用数据类型限制),同时也能使得 panic 错误捕获更加精准。

13610
您找到你想要的搜索结果了吗?
是的
没有找到

Rust学习笔记之错误处理

backtrace 是一个执行到目前位置所有被调用函数列表。Rust backtrace 跟其他语言中一样:阅读 backtrace 关键是从头开始读直到发现你编写文件。...这就是问题发源地。这一行往上是你代码所调用代码;往下则是调用代码代码。这些行可能包含核心 Rust 代码,标准库代码或用到 crate 代码。...宏输出。 ---- 匹配不同错误 上面代码不管 File::open 是因为什么原因失败都会 panic!。...错误信息:expect。使用 expect 而不是 unwrap 并提供一个好错误信息可以表明你意图并更易于追踪 panic 根源。...expect调用 panic! 时使用错误信息将是我们传递给 expect 参数,而不像 unwrap 那样使用默认 panic! 信息。

49720

周末学了点 Rust简介工具链宏(macros)返回值和错误处理Ownership 和生命周期闭包小结参考文档

其中,最重要是 cargo 这个包管理工具,rustc 编译器使用,大部分也是通过 cargo 来调用。...那个感叹号时,我强迫症要爆发了 —— 这个“函数名”为什么要多一个感叹号!!! 往下看,发现 xyz! 这种东东在 Rust 中叫做 宏(macros)。...为了简化 Rust 错误处理代码,Restlt 实现了一些错误处理封装:unwrap 和 expect。...使用示例: use std::fs::File; fn main() { let f = File::open("hello.txt").unwrap(); } expect expect,...当打开文件或读取文件数据出错时,我们希望把错误传递给调用方,而不是直接 panic!,所以不能使用 unwrap 或 expect

91620

30.Rust-错误处理

Rust 语言也有错误这个概念,而且把错误分为两大类:可恢复 和 不可恢复,相当于其它语言 异常 和 错误。...() 程序立即退出,退出时调用者抛出退出原因。一般情况下,当遇到不可恢复错误时,程序会自动调用 panic!()。fn main() { panic!("出错啦"); println!...("Hello Rust"); // 不可能执行语句}//输出thread 'main' panicked at '出错啦', src/main.rs:2:5let v = vec!...() 函数原型如下unwrap(self):Tunwrap是 Result方法,在实例上调用此方法时,如果是 Ok 枚举值,就会返回 Ok 中对象,如果是 Err 枚举值,在运行时会...() 原型如下expect(self,msg:&str):Texpect方法作用和unwrap类似,区别在于,expect方法接受msg: &str作为参数,它在运行时panic信息为format

34120

Rust学习笔记(2)- Cargo包管理器

new会创建一个对应名称目录,并已经配置好了git本地仓库,如果已经处于git本地仓库中,则不会覆盖存在仓库。...这一点rust和其他语言差异比较大,像其他语言,一般要定义不可变常量,通常需要有类似const或者final这样关键字来说明,而rust反而是没有关键字说明就是不可变常量。...read_line方法应该是属于Stdin实例一个方法,用于在控制台读取输入一行内容(回车为结束标识),&符号表示后面的参数是一个引用(reference),默认情况下,引用是不可变,只能读取值..., } 这是一个match表达式,其中调用了cmp方法,cmp方法可以用于所有可比较类型,这里我们把guess和secret_number进行比较。...Rust学习笔记(1)

83740

Rust入坑指南:亡羊补牢

如果还没来得及看也没有关系,我把我看到一些方法分享给你。 这里介绍两种方法,一种是expect,另一种是unwrap系列方法。我们通过一个例子来感受一下。...(b.expect("b is none"), "b is none"); //匹配到None会引起线程恐慌,打印错误是expect参数信息 assert_eq!...利用and_then方法,我们就可以有如下链式调用: fn main() { assert_eq!...它会使代码变得非常精简,但是在发生错误时,会将错误返回,传播到外部调用函数中,所以我们在使用之前要考虑清楚是否需要传播错误。 对于上面的代码,使用try!宏就会非常精简。...总结 至此,Rust处理错误方法我们已经基本介绍完了,为什么说是基本介绍完了呢?

82710

Rust学习】02_猜谜游戏

当您使用 .method_name() 语法调用方法时,用换行和空格来拆分长代码行通常是明智。现在让我们来看看这行代码干了什么。...如果 io::Result 实例值是 Err,expect 会导致程序崩溃,并显示传递给 expect 参数。如果 read_line 方法返回 Err,则可能是操作系统底层引起错误结果。...如果不调用 expect,程序也能编译,但会出现警告提示:Rust 警告您尚未使用 返回 read_line Result 值,表明程序尚未处理可能错误。...在第一行中,我们调用了为我们提供将要使用特定随机数生成器 rand::thread_rng 函数:该生成器是当前执行线程本地变量,并由操作系统设定种子。...调用切换到 match 表达式,从在错误时崩溃转变为处理错误。

7710

Rust语言尝鲜

而且一个报错信息就一万多行,然后必须是大师级程序员,精通 Intel规范汇编语言那种C++程序员,才能搞清楚什么地方出了问题。个人认为Rust对于程序员综合素质要求,是低于C++。...    let sub_area = | x:f64 | {         f(x)*dx     };//一个子区间面积,还调用了被积函数     let  res = (0..steps)...有一些机器学习Python代码,很难理解。在学习一些底层语言比如C++,Rust之后,再去思考,就会容易一些了。...,为什么?原来我们在输入时按了enter键,\n意味着换行。 use std::io::stdin; fn main() {     println!("What is 3+2? ....");     let mut input = String::new();//字符串变量     stdin()     .read_line(&mut input)     .expect("Unable

39830

Rust笔记】Rust与Java交互-JNI模块编写-实践总结

近期工作中有Rust和Java互相调用需求,这篇文章主要介绍如何用Rust通过JNI和Java进行交互,还有记录一下开发过程中遇到一些坑。...既然是C语言接口,那么理论上支持C ABI语言都可以和Java语言互相调用Rust就是其中之一。...关于JNI历史背景以及更详细介绍可以参考官方文档 在Rust中和Java互相调用,可以使用原始JNI接口,也就是自己声明JNIC函数原型,在Rust里按照C方式去调用,但这样写起来会很繁琐,而且都是...或者JClass等对象;GlobalRef对象drop时候,会调用DeleteGlobalRef将JVM内部引用删除 前面的代码,从Rust调用Java方法都是通过名称加方法签名调用,这种方式,写起来很舒服...系列函数,来更高效地调用Java 我用Rust强大宏,实现了这个过程,可以让我们直接在Rust中以声明方式缓存所需类及其方法ID #[allow(non_snake_case)] pub mod

79930

tauri学习(4)-多窗口

中,如果想开2个窗口,分别对应于这2个页面,可以参考下图配置: (关于windows节点下,具体有哪些属性可配置,可参考官网文档) 运行起来效果如下: 二、Rust中使用app创建窗口 use tauri...()) .expect("error while running tauri application"); } 运行起来后,加上方式1中2个窗口,总共会有3个窗口: 三、前端创建窗口 3.1...使用tauri::command 上节学习过前端可以调用Rust方法,同样这种方式,也可以创建窗口。...先把tauri.conf.json中配置恢复成单窗口,方式二中创建窗口也去掉,然后加1个可供前端调用新方法: 然后在Home组件中,调用该方法: 运行效果:  3.2 js API调用 运行效果...: 四、运行时获取窗口引用 比如想用代码把前面创建2个about窗口给关闭,就必须先获取窗口引用,参考下面的代码: 运行效果: 参考文章: https://tauri.app/v1/guides

3K20

听GPT 讲Rust源代码--srctools(24)

/clippy_lints/src/methods/expect_fun_call.rs文件用于定义一个Clippy lint规则,该规则检测代码中使用了expect函数调用,提出了警告或建议对其进行修改...尽管expect函数提供了一种简便处理方法,但滥用可以导致程序终止,因此在使用时需要小心。 expect_fun_call.rs文件中lint规则就是为了避免滥用expect函数。...此规则通过在Rust语法树中搜索特定模式函数调用,找到使用expect情况,并根据上下文和代码语义分析,向开发人员提出警告或建议。...这个lint规则对代码中每个expect函数调用进行检查,并根据上下文给出相应警告或者建议。...该 lint 实例会对 Rust 代码进行抽象语法树(AST)遍历,找到所有使用 unwrap 和 expect 方法地方,并对这些代码进行静态检查。

12210

Rust 错误处理

恐慌 7.1 panic 当程序遇到下列问题时候,就可以断定程序自身存在 bug,故而会引发 panic: 数组越界访问; 整数除以 0; 在恰好为 Err Result 上调用 .expect(...如果设置了 RUST_BACKTRACE 环境变量,那么就像这条消息中建议Rust 也会在这里转储当前调用栈。 展开调用栈。这很像 C++ 异常处理。...当前函数使用任何临时值、局部变量或参数都将按照与创建它们时相反顺序被丢弃。丢弃一个值仅仅意味着随后会进行清理:程序正在使用任何字符串或向量都将被释放,所有打开文件都将被关闭,等等。...消除警告,解决编译器报警问题 7.2.8 处理 main() 中错误 在大多数生成 Result 地方,让错误冒泡到调用者通常是正确行为。这就是为什么 ? 在 Rust 中会设计成单字符语法。...7.2.10 为什么是 Result 现在我们已经足够了解为何 Rust 会优先选择 Result 而非异常了。以下是此设计几个要点。

7510
领券