Официальная книга Rust, Язык программирования Rust , свободно доступна онлайн. В нем есть целая глава по использованию Result
, в которой объясняются вводные темы, такие как перечисление Result
и как его использовать.
Как вернуть Result
, содержащий serde_json::Value
?
Так же, как вы возвращаете Result
типа любого ; в Value
нет ничего особенного:
use serde_json::json; // 1.0.38
pub fn ok_example() -> Result<serde_json::value::Value, i32> {
Ok(json! { "success" })
}
pub fn err_example() -> Result<serde_json::value::Value, i32> {
Err(42)
}
Если у вас есть функция, которая возвращает Result
, вы можете использовать оператор вопросительного знака (?
), чтобы досрочно выйти из функции при ошибке и вернуть ошибку. Это краткий способ избежать unwrap
или expect
:
fn use_them() -> Result<(), i32> {
let ok = ok_example()?;
println!("{:?}", ok);
let err = err_example()?;
println!("{:?}", err); // Never executed, we always exit due to the `?`
Ok(()) // Never executed
}
Это просто базовый пример.
Применительно к MCVE это будет выглядеть примерно так:
use reqwest; // 0.9.10
use serde_json::Value; // 1.0.38
type Error = Box<dyn std::error::Error>;
pub fn perform_get(_id: String) -> Result<Value, Error> {
let client = reqwest::Client::builder().build()?;
let url = String::from("SomeURL");
let res = client.get(&url).send()?.text()?;
let v = serde_json::from_str(&res)?;
Ok(v)
}
Здесь я использую объект trait Box<dyn std::error::Error>
для обработки любых ошибок (отлично подходит для быстрых программ и примеров). Затем я набрасываю ?
на каждый метод, который может потерпеть неудачу (т.е. возвращает Result
), и заканчиваю функцию явным Ok
для окончательного значения.
Обратите внимание, что с помощью этого стиля можно удалить panic
и никогда не использованное значение null
.
Смотри также:
Лучше практиковать возвращение Result
Смотри также: