我正试图从Python背景进入Rust,我遇到了一个PoC的问题,我正在搞乱。我已经阅读了大量关于如何处理Rust中的错误的博客和文档,但是当我使用unwrap
并引起恐慌时,我无法弄清楚如何实现它。以下是代码的一部分:
fn main() {
let listener = TcpListener::bind("127.0.0.1:5432").unwrap();
// The .0 at the end is indexing a tuple, FYI
loop {
let stream = listener.accept().unwrap().0;
stream.set_read_timeout(Some(Duration::from_millis(100)));
handle_request(stream);
}
}
// Things change a bit in here
fn handle_request(stream: TcpStream) {
let address = stream.peer_addr().unwrap();
let mut reader = BufReader::new(stream);
let mut payload = "".to_string();
for line in reader.by_ref().lines() {
let brap = line.unwrap();
payload.push_str(&*brap);
if brap == "" {
break;
}
}
println!("{0} -> {1}", address, payload);
send_response(reader.into_inner());
}
正在处理套接字没有按预期在流上接收set_read_timeout
的任何内容,但是当它在循环中触发我的unwrap
时,它会引起恐慌。有人可以帮助我理解我应该如何正确地将匹配或Option
应用于此代码吗?
答案 0 :(得分:9)
这里似乎有很大的脱节。恐慌线程unwrap
或expect
处理错误。你不是真的应该在99.9%的Rust程序中“处理”恐慌;你只是让事情死去。
如果您不想恐慌,请不要使用unwrap
或expect
。相反,请通过Result
或Option
传回错误,如Error Handling section of The Rust Programming Language中所述。
您可以在match
或Result
上Option
(或任何其他模式匹配技术),并根据您的情况正确处理错误。处理外循环中错误的一个示例:
use std::net::{TcpStream, TcpListener};
use std::time::Duration;
use std::io::prelude::*;
use std::io::BufReader;
fn main() {
let listener = TcpListener::bind("127.0.0.1:5432")
.expect("Unable to bind to the port");
loop {
if let Ok((stream, _)) = listener.accept() {
stream
.set_read_timeout(Some(Duration::from_millis(100)))
.expect("Unable to set timeout");
handle_request(stream);
}
}
}
请注意,我高度建议在几乎所有情况下都使用expect
而不是unwrap
。