Ваш код уже возвращает и обрабатывает ошибку. Если вы попытались использовать ошибку, компилятор быстро направит вас к решению:
if let Err(e) = res {
println!("err: {}", e);
}
error[E0277]: `(std::string::String, futures::stream::futures_unordered::FuturesUnordered<impl futures::future::Future>)` doesn't implement `std::fmt::Display`
--> src/main.rs:12:29
|
12 | println!("err: {}", e);
| ^ `(std::string::String, futures::stream::futures_unordered::FuturesUnordered<impl futures::future::Future>)` cannot be formatted with the default formatter
|
= help: the trait `std::fmt::Display` is not implemented for `(std::string::String, futures::stream::futures_unordered::FuturesUnordered<impl futures::future::Future>)`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
= note: required by `std::fmt::Display::fmt`
Значение Err
- это кортеж вашей ошибки, и исходный поток будет продолжать вытягивать после того, как вы исправите ошибку. Это то, что Stream::into_future
/ StreamFuture
делает.
Получите доступ к первому значению в кортеже, чтобы получить ошибку:
if let Err((e, _)) = res {
println!("err: {}", e);
}
Если вы хотите увидеть все значения, вы можете продолжать опрашивать поток снова и снова (но не делайте этого, потому что он, вероятно, неэффективен):
let mut f = tasks.into_future();
loop {
match runtime.block_on(f) {
Ok((None, _)) => {
println!("Stream complete");
break;
}
Ok((Some(v), next)) => {
println!("Success: {:?}", v);
f = next.into_future();
}
Err((e, next)) => {
println!("Error: {:?}", e);
f = next.into_future();
}
}
}