🦀 Rust 错误处理快问快答

测试你对 Rust 错误处理机制的理解:Result、Option、panic! 等

10
题目数量
20
预计时间(分钟)
⭐⭐⭐
难度等级
第1题 (判断题)
在Rust中,Result类型用于表示可能失败的操作,其中T表示成功时的值类型,E表示错误类型。
正确
错误

答案解析:

答案:正确

Result是Rust中处理可恢复错误的标准类型。

T是成功情况下Ok(T)中包含的值类型,E是失败情况下Err(E)中包含的错误类型。

这种设计强制开发者显式处理错误情况。

第2题 (选择题)
下列哪个操作符用于传播错误,即如果Result是Err则提前返回错误?
!
?
&
*

答案解析:

答案:?

?操作符是Rust中的错误传播操作符,用于简化错误处理。

如果Result是Ok(value),则返回value;如果是Err(error),则提前返回Err(error)。

这大大减少了手动match Result的样板代码。

第3题 (选择题)
Option类型的两个变体是什么?
Ok(T) 和 Err(E)
Some(T) 和 None
Success(T) 和 Failure
Value(T) 和 Empty

答案解析:

答案:Some(T) 和 None

Option用于表示可能存在或不存在的值。

Some(T)表示存在值T,None表示没有值。

这避免了空指针异常,是Rust安全性的重要组成部分。

第4题 (判断题)
panic!宏会导致程序立即终止,无法被捕获和处理。
正确
错误

答案解析:

答案:错误

panic!可以通过std::panic::catch_unwind函数捕获。

不过panic!主要用于不可恢复的错误,通常表示程序逻辑错误。

在大多数情况下,应该使用Result来处理可恢复的错误。

第5题 (选择题)
下面哪个方法用于获取Result中的值,如果是Err则panic?
get()
unwrap()
extract()
value()

答案解析:

答案:unwrap()

unwrap()方法会返回Ok中的值,如果是Err则调用panic!。

类似的还有expect(msg),可以提供自定义的panic消息。

在生产代码中应谨慎使用,更推荐使用模式匹配或?操作符。

第6题 (简答题)
请写出两个用于处理Option的常用方法,一个用于提供默认值,一个用于链式调用。

答案解析:

答案:unwrap_or, map(或其他合理答案)

unwrap_or(default):如果是Some(T)返回T,如果是None返回默认值。

map(f):如果是Some(T)则应用函数f得到Some(f(T)),如果是None保持None。

其他常用方法还有:unwrap_or_else, and_then, or_else等。

第7题 (选择题)
在函数签名中,下面哪个表示函数可能返回错误?
fn foo() -> i32
fn foo() -> Result
fn foo() -> Option
fn foo() -> i32!

答案解析:

答案:fn foo() -> Result

Result明确表示函数可能成功返回T或失败返回错误E。

Option表示可能有值或没有值,但不是错误处理。

这种显式的错误处理是Rust安全性的重要特征。

第8题 (判断题)
在Rust中,所有的错误都必须被显式处理,编译器不允许忽略Result类型的返回值。
正确
错误

答案解析:

答案:错误

虽然Rust鼓励显式错误处理,但可以使用let _ = 来忽略Result。

编译器会对未使用的Result发出警告,但不是编译错误。

可以使用#[must_use]属性强制要求处理某些类型的返回值。

第9题 (选择题)
下面哪个是创建自定义错误类型的最佳实践?
使用String作为错误类型
实现std::error::Error trait
使用i32错误码
使用panic!处理所有错误

答案解析:

答案:实现std::error::Error trait

实现Error trait提供了标准的错误处理接口。

这样的错误类型可以与其他Rust错误处理工具很好地集成。

通常还会实现Display和Debug trait来提供错误信息。

第10题 (简答题)
在Rust中,什么情况下应该使用panic!而不是Result?请简述一种情况。

答案解析:

答案:程序逻辑错误(或类似表述)

panic!适用于不可恢复的错误,特别是程序逻辑错误。

例如:数组越界、除零、断言失败等情况。

这些错误通常表示程序存在bug,应该修复代码而不是处理错误。

而Result适用于可预期的、可恢复的错误,如文件不存在、网络连接失败等。

🎉
恭喜完成测验!
10/10
你对Rust错误处理的掌握非常出色!