如何在套接字连接失败时不崩溃

How to not crash when a socket fails to connect

我正在构建一个比特币克隆,它需要能够连接到其他套接字并在它们之间发送信息。我如何尝试连接到另一个套接字,如果套接字没有响应,则继续执行代码而不是使整个程序崩溃?

我认为代码应该是这样的:

use std::io::prelude::*;
use std::net::TcpStream;

fn main()
{
    for node in nodes {
        let mut stream = TcpStream::connect(node).unwrap();
        if successful_connection {
            break;
        }
    }
}

问题是你使用了unwrap()。来自 its docs:

Panics if the value is an Err, with a panic message provided by the Err’s value.

此函数的目的是在操作失败时中止您的程序,因此:

Because this function may panic, its use is generally discouraged. Instead, prefer to use pattern matching and handle the Err case explicitly, or call unwrap_or, unwrap_or_else, or unwrap_or_default.

如果你只想在操作成功时做某事,而在其他情况下什么都不做,if let 是你最好的朋友:

if let Ok(stream) = TcpStream::connect(node) {
    // Do something with `stream`
}

如果你也想处理错误情况,可以使用match:

match TcpStream::connect(node) {
    Ok(stream) => {
        // Do something with `stream`
    }
    Err(error) => {
        // Handle the error
    }
}