サイトアイコン アマチュア無線局JS2IIU

【Streamlit】エラーハンドリング

こんにちは、JS2IIUです。
エラー発生時の適切な処理とユーザーへのフィードバックは使いやすいUIを構成するのに不可欠です。今回もよろしくお願いします。

1. はじめに

StreamlitはPythonで手軽にWebアプリを作れる便利なライブラリです。しかし、アプリを公開した際にエラーが発生すると、アプリが止まってしまったり、ユーザーにとってわかりにくいエラー画面が表示されたりすることがあります。

本記事では、Streamlitでエラーが発生したときに、アプリが止まらないようにする方法や、ユーザーにわかりやすくフィードバックする方法について解説します。

2. エラーが起きるとどうなる?(未対策の例)

まずは、Streamlitでエラーハンドリングを行っていない状態で、エラーが発生した場合を見てみましょう。

📌 例:除算処理で0割が発生するケース

以下は、Streamlit上で数値を入力し、割り算の結果を表示するアプリです。

Python
import streamlit as st

st.title("除算アプリ")

x = st.number_input("分子を入力してください", value=10)
y = st.number_input("分母を入力してください", value=0)

result = x / y  # ここで ZeroDivisionError が発生!
st.write(f"結果: {result}")

このコードを実行すると、分母が 0 のため、ZeroDivisionError(ゼロ除算エラー)が発生し、アプリは次のようなエラーメッセージを表示して停止してしまいます。

❌ ユーザーにとっての問題点

このような状態では、ユーザーにとって使いにくいアプリになってしまいます。

3. try-exceptで基本的なエラーハンドリングを行う

Pythonでは、エラーが発生しそうな処理を try-except 文で囲むことで、エラーをキャッチしてアプリのクラッシュを防ぐことができます。

✅ エラーハンドリングを追加したコード

Python
import streamlit as st

st.title("除算アプリ(エラーハンドリング付き)")

x = st.number_input("分子を入力してください", value=10)
y = st.number_input("分母を入力してください", value=0)

try:
    result = x / y
    st.write(f"結果: {result}")
except ZeroDivisionError:
    st.error("⚠️ 0で割ることはできません。分母を変更してください。")

🔍 解説

🧠 補足:Streamlitのエラーメッセージ関数

関数説明
st.error("メッセージ")エラー表示(赤色)
st.warning("メッセージ")注意表示(黄色)
st.info("メッセージ")情報表示(青色)

4. 関数化した処理でのエラーハンドリング

より実践的な場面では、処理を関数としてまとめることがよくあります。以下は、CSVファイルを読み込む関数の例です。

📄 例:CSVファイルを読み込むアプリ

Python
import streamlit as st
import pandas as pd

st.title("CSVファイル読み込みアプリ")

uploaded_file = st.file_uploader("CSVファイルを選択してください", type="csv")

def load_csv(file):
    try:
        df = pd.read_csv(file)
        return df
    except Exception as e:
        st.error(f"ファイルの読み込みに失敗しました。エラー内容: {e}")
        return None

if uploaded_file is not None:
    df = load_csv(uploaded_file)
    if df is not None:
        st.dataframe(df)

🔍 解説

5. 開発中はst.exceptionで詳細なデバッグも可能

開発中には、エラーの詳細情報(トレースバック)を表示して原因を特定したい場合があります。そんなときは st.exception() が便利です。

🔧 例:開発者向けのエラー詳細表示

Python
try:
    # ここに処理
except Exception as e:
    st.exception(e)  # エラーの詳細を表示(トレースバック付き)

st.exception() は、Pythonの標準的なエラーメッセージをそのままStreamlitアプリ上に表示してくれるので、デバッグ用に最適です。

6. よくあるエラーとその対処例

エラー名主な原因対処法
ZeroDivisionError0で割っている入力値をチェック or try-exceptで捕捉
FileNotFoundErrorファイルが見つからないパスの確認 or ファイルアップロード機能を使う
ValueError不正な値入力前に検証(バリデーション)する
TypeError型が合っていない型の確認と変換

7. ユーザー体験を向上させるヒント

8. まとめ

9. 参考リンク

モバイルバージョンを終了