如何在套接字连接失败时不崩溃
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
}
}
我正在构建一个比特币克隆,它需要能够连接到其他套接字并在它们之间发送信息。我如何尝试连接到另一个套接字,如果套接字没有响应,则继续执行代码而不是使整个程序崩溃?
我认为代码应该是这样的:
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 theErr
’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 callunwrap_or
,unwrap_or_else
, orunwrap_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
}
}