質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

280閲覧

Flask稼働時の例外処理の最適解について

Tohmas_1010

総合スコア15

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2024/08/12 08:47

編集2024/08/13 08:55

発生している問題・分からないこと

以下のapp.pyを実行するとFlaskサーバーが立ち上がると仮定します。そこでx.pyの関数で使われているAPIkeyが不正だった場合、ログには以下のエラーメッセージが表示されるだけで、API関連のエラーだということが読み取れません。一応、以下の「試したこと」の方法で「以下のエラーメッセージ」に加えて「API関連のエラーだということその詳細(ファイル名や行数)」を表示させることはできましたが、もっと最適なコードの書き方はないでしょうか?

エラーメッセージ

imageURL, explain = X()
TypeError: cannot unpack non-iterable NoneType object

試したこと

x.pyの関数に「例外処理を加えてHttp errorをキャッチさせる」という機能と「tracebackモジュールで詳細の場所も表示させる」という機能を加えてapp.py稼働時のログに表示させた。

コード

Python

1--------- 2app.py 3--------- 4from x import X 5 6# Flask稼働中に実行される 7imageURL, explain = X()

Python

1--------- 2x.py 3--------- 4# APIを使ってimageURL, explainを取得して返す 5def X(): 6 res = request.get(http://exsample) 7 jsondata = res.json() 8 imageURL = jsondata['imageURL'] 9 explain = jsondata['explain'] 10 return imageURL, explain

Python

1Deepl_APIkey = os.getenv('Deepl_APIkey') 2 3def translate(source_txt): 4 try: 5 params = {'auth_key': Deepl_APIkey, 'text': source_txt, 'source_lang': 'EN', "target_lang": 'JA'} 6 deepl_response = requests.post("https://api-free.deepl.com/v2/translate", data=params) 7 deepl_response.raise_for_status() 8 deepl_json = deepl_response.json() 9 translated_text = deepl_json['translations'][0]['text'] 10 translated_text = translated_text.replace("。", "。\n" + os.linesep) # 自動改行 11 translated_text = translated_text.rstrip(os.linesep) # 最後の改行を削除 12 return translated_text 13 14 except HTTPError as h: 15 if '403' in str(h) or '404' in str(h): 16 print(f'=== APIKeyまたはendpointを確認してください ===\n{h}\n{traceback.extract_tb(h.__traceback__)[0]}') 17 else: 18 print(f'=== HTTPError ===\n{h}\n{traceback.extract_tb(h.__traceback__)[0]}') 19 except RequestException as re: 20 print(f'=== その他のエラーが発生しました ===\n{re}\n{traceback.extract_tb(h.__traceback__)[0]}')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2024/08/12 09:38

質問の内容が何のことなのかまったくわかりません。 状況がわかるように、システムの概要やソースコードの内容などについて追記いただけますか。 エラーメッセージについては、単に X()がNoneを返しているだけだと思います。Noneを返している原因を確認すればいいでしょう。
Tohmas_1010

2024/08/12 11:27

失礼しました。修正しました、よろしくお願いします。
TakaiY

2024/08/12 13:34

このソースコードだとX()がNoneを返すことは無いはずなので、X()が値を替えせない状況の場合、X()の中で例外が発生します。 このソースをどのように実行しているのでしょうか。
Tohmas_1010

2024/08/12 13:45

app.pyを実行してflaskを稼働させています。 はい、X()の中でapikeyやエンドポイントが不正なため記載したエラーが出ております。しかしこのエラー文だと「apikeyやエンドポイントが不正」だということが読み取れません。 「試した方法」に記載したやり方で一応はそれが読み取れる(ログでhttp errorと発生場所が分かる)ようにはなりましたが、この場合のベストプラクティスが知りたいと思いまして。
TakaiY

2024/08/12 14:14

> app.pyを実行してflaskを稼働させています。 「Flaskを稼動させる」とはどういう意味でしょう? > apikeyやエンドポイントが不正なため これは運用中に起き得るものですか? 検討段階での不一致ですか? 製造のバグですか?
Tohmas_1010

2024/08/13 05:32

情報不足ですみません。 > このソースをどのように実行しているのでしょうか。 app.pyを実行するとFlaskサーバーが起動します。app.py内である関数が実行された時に「imageURL, explain」がユーザーにPOSTされるという設定です。 > これは運用中に起き得るものですか? 検討段階での不一致ですか? 製造のバグですか? 運用中にkeyやエンドポイントが正しく設定されていない場合に起き得るものです。
guest

回答1

0

ベストアンサー

結局、どういうシステムなのかまったくわかりませんでしたが、

運用中にkeyやエンドポイントが正しく設定されていない場合に起き得るものです。

であれば、

x.pyの関数に「例外処理を加えてHttp errorをキャッチさせる」という機能と「tracebackモジュールで詳細の場所も表示させる」という機能を加えてapp.py稼働時のログに表示させた。

この対応がベストだと思います。
発生する場所を限定的に補足して、必要な対処をするというのが原則だと思います。
また、関数Xについては、異常終了する可能性があるのですから、呼び出し側にそれが伝わるような仕様にすべきと思います。

投稿2024/08/13 07:36

TakaiY

総合スコア13584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tohmas_1010

2024/08/13 08:40

相談に乗っていただいてありがとうございます!
Tohmas_1010

2024/08/13 08:56

すみません、もう一つだけいいでしょうか。 追加したコードの例外処理の書き方に改善点などありますか?
TakaiY

2024/08/13 14:16

例外が発生したときにどのように処理したいのかが不明なので難しいですが、回答にも書きましたが、運用中に想定範囲内の問題が発生したときの対処としては間違えていると思います。 関数translateの中で例外が発生する可能性のあることが判っていてtry-exceptで受けているのですから、発生時にそれなりの情報を呼び出し元に返すべきで、呼び出し元はそれを想定した呼び出し方にするべきです。
Tohmas_1010

2024/08/13 14:35

参考になります。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問