Appearance
3. 异常处理
panic
rust
fn main() {
panic!("crash and burn");
}
fn main() {
panic!("crash and burn");
}
Rust 为我们提供了 panic! 宏,当调用执行该宏时,程序会打印出一个错误信息,展开报错点往前的函数调用堆栈,最后退出程序。
match
rust
use std::fs::File;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => {
panic!("Problem opening the file: {:?}", error)
},
};
}
use std::fs::File;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => {
panic!("Problem opening the file: {:?}", error)
},
};
}
使用match
对Err的情况处理
unwrap
rust
use std::net::IpAddr;
let home: IpAddr = "127.0.0.1".parse().unwrap();
use std::net::IpAddr;
let home: IpAddr = "127.0.0.1".parse().unwrap();
它返回一个 Result<IpAddr, E>
类型,如果解析成功,则把 Ok(IpAddr)
中的值赋给 home,如果失败,则不处理 Err(E)
,而是直接 panic
。
expect
rust
use std::fs::File;
fn main() {
let f = File::open("hello.txt").expect("Failed to open hello.txt");
}
use std::fs::File;
fn main() {
let f = File::open("hello.txt").expect("Failed to open hello.txt");
}
expect
相比 unwrap 能提供更精确的错误信息
?
用于Result
rust
use std::fs::File;
use std::io;
use std::io::Read;
fn read_username_from_file() -> Result<String, io::Error> {
let mut f = File::open("hello.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
use std::fs::File;
use std::io;
use std::io::Read;
fn read_username_from_file() -> Result<String, io::Error> {
let mut f = File::open("hello.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
如果read_to_string
返回的是Result:Err
, 相当于直接 return 了Err, 不会进行后面的代码。
用于Option
rust
fn first(arr: &[i32]) -> Option<&i32> {
let v = arr.get(0)?;
Some(v)
}
fn first(arr: &[i32]) -> Option<&i32> {
let v = arr.get(0)?;
Some(v)
}
如果arr.get
返回的是None
, 也会直接 return None
切记:? 操作符需要一个变量来承载正确的值