gpt4 book ai didi

rust - 我应该如何在展开后应用匹配项或选项?

转载 作者:行者123 更新时间:2023-11-29 08:10:12 25 4
gpt4 key购买 nike

我正试图从 Python 背景进入 Rust,但我遇到了一个 PoC 问题,我正在搞乱。我已经阅读了很多关于如何处理 Rust 错误的博客和文档,但是当我使用 unwrap 时我无法弄清楚如何实现它并感到 panic 。以下是部分代码:

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 时,它会导致 panic 。有人可以帮助我理解我应该如何正确地应用匹配项或 Option 到此代码吗?

最佳答案

这里似乎有很大的脱节。 unwrapexpect 通过 panic 线程来处理错误。你真的不应该在 99.9% 的 Rust 程序中“处理” panic ;你只是让事情死去。

如果您不想出现 panic ,请不要使用unwrapexpect。相反,通过 ResultOption 传回错误,如 Error Handling section of The Rust Programming Language 中所述.

您可以在 ResultOption匹配(或任何其他模式匹配技术)并根据您的情况适本地处理错误。在外循环中处理错误的一个示例:

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

关于rust - 我应该如何在展开后应用匹配项或选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38666006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com