打开后如何应用匹配或选项?

时间:2016-07-29 19:11:43

标签: rust

我正试图从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应用于此代码吗?

1 个答案:

答案 0 :(得分:9)

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

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

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

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