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

Streamlit
この記事は約5分で読めます。

こんにちは、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で割ることはできません。分母を変更してください。")

🔍 解説

  • try ブロック内で割り算を実行します。
  • except ZeroDivisionError: でゼロ除算エラーが起きた場合に、st.error() を使ってエラーメッセージを表示します。
  • アプリはクラッシュせず、ユーザーに優しくエラーを伝えられます。

🧠 補足: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)

🔍 解説

  • load_csv 関数でファイル読み込み処理を行い、try-except でエラーを捕捉します。
  • pandas.read_csv() で何らかのエラーが出た場合でも、アプリが止まらずエラーメッセージが表示されます。
  • st.dataframe() で正常に読み込めたデータを表示します。

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. ユーザー体験を向上させるヒント

  • エラーを事前に防ぐUI設計
     例:分母の初期値を1にするなど、ユーザーがミスをしにくい設計に。
  • 入力値を検証する(バリデーション)
     例:分母が0でないかチェックしてから計算を実行。
  • わかりやすいフィードバックを表示する
     「〇〇を入力してください」「形式が違います」など、次の行動を案内。

8. まとめ

  • Streamlitでは、try-except を使うことでエラーによるアプリ停止を防げます。
  • st.error() などの表示関数でユーザーに優しく伝えることが大切です。
  • st.exception() を使えば、開発時のデバッグもスムーズになります。
  • ユーザーにとって安心できるUI/UX設計を意識しましょう。

9. 参考リンク

コメント

タイトルとURLをコピーしました