🔲

Rustのreqwestライブラリのエラーハンドリングでハマった件

2024/09/20に公開

正常形

let url = "https://jsonplaceholder.typicode.com/users/1";
let response = reqwest::get(url).await;
println!("{:?}", response); // Result型はOKで帰ってくる

異常形(存在しないドメイン)

let url = "https://unkown.example.com/";
let response = reqwest::get(url).await;
println!("{:?}", response); // Result型はErrで帰ってくる

異常形(存在するドメインだがPathが存在しない)

let url = "https://jsonplaceholder.typicode.com/unkownpath/1";
let response = reqwest::get(url).await;
println!("{:?}", response); // Result型はOKで帰ってくる!!

ここがなんでやねんポイント!!

両対応でエラーハンドリングする方法

let url = "https://jsonplaceholder.typicode.com/unkownpath/1";
let response = reqwest::get(url).await;

// サーバに接続できなかった系エラー
if response.is_err() {
    println!("{:?}", err);
}

// サーバに接続できたが、ステータスがエラーの場合
if let Err(ref err) = response.as_ref().unwrap().error_for_status_ref() {
    println!("{:?}", err);
}

面倒だが、両方のパターンをチェックする必要があるっぽい。

まとめ

個人的には404はエラーだと思うのだが、ライブラリ作者としては通信が成功した場合はOKということになるっぽい。

Discussion