pythonのコーディング規約について、少々お聞きしたいことがあります
Djangoでの開発を行っている際に、try except
構文にて、以下のような形で詳細な例外を指定しなかった場合に、コーディング規約であるpep8の警告がエディターで表示されてしまいました。
try: user.save() except: return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
しかし、例えばですが、例外の種類によって、例外が発生した場合の処理を分ける必要がない場合は全ての例外をキャッチする形でも問題ないように思えます。
現状、警告を無視しても良いのか、どう対処するべきかいまいち分からない状況な為、ご助言の程頂きたいです。
よろしくお願いします
※except内の処理は誤解を生んでしまっていたので、変更しました
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/13 01:55
回答2件
0
ベストアンサー
maisumakunさんの回答の補足ですが、その警告の意図は、
そういった例外の大域捕捉がやりたいなら
python
1while True: 2 try: 3 print(int(input()) * 10) 4 except: 5 pass
じゃなくて
python
1while True: 2 try: 3 print(int(input()) * 10) 4 except Exception: 5 pass
とexcept Exception:
で書きなさい、というものです。
実行して動作を比べてみてください。上のコードをCtrl+Cで終了させようとする時に"生のexcept"が意味するところが判ると思います。
警告はそれで消えると思います。(チェッカが分からないので断言はできませんが)
それはそれとして質問の本筋です。
例えばtweepyの例でバージョン4.0からそれまでのTweepErrorを、TweepyExceptionとHTTPExceptionに分離しました。
https://docs.tweepy.org/en/stable/changelog.html#version-4-0-0
Replace TweepError with TweepyException (5c39cd1) and HTTPException (#599)
取り扱えないイメージを渡したなどで差し戻された時に発生するのがTweepyException
Twitter APIから200番台じゃない異常ステータスが返ってきた時に発生するのがHTTPException
と分けられたわけです。
python
1try: 2 api.some_api(**some_args) 3except TweepError: 4 print('something wrong')
と書いていた人は修正する手間が発生しました。
python
1try: 2 api.some_api(some_args) 3except Exception: 4 print('something wrong')
と書いていた人は修正せずに済みました。
後者の方が幸せでしたね、という結論になりますか? という話です。
TweepErrorをTweepyExceptionとHTTPExceptionに分離した意図は、
例外が発生する状況を精査すると対処しなければならないことが異なるケースを同じ例外にしていた。これはよくない
ということだと思います。
TweepErrorとは別にHTTPExceptionを追加するだけだと、既存のコードはそのまま動くかもしれないけれど、それでは「対処しなければならないことが異なる」ことに対して対処するチャンスを奪うわけです。
その時におこなわれた議論を調べたわけではなくてこれはただの想像ですが、TweepErrorからTweepyExceptionにすることで意図を明確化したんだろうと思ってます。
この時
python
1try: 2 api.some_api(some_args) 3except Exception: 4 print('something wrong')
としていた人はそのまま動いてしまうため、TweepyExceptionとHTTPExceptionに分離した意図に気づけないです。
業務寄りの開発ではより切実でしょう。
ある例外に対する対処コードを変更しなければならないとなった時、修正するべき箇所がどこにあるかを探索するのにぜんぶをexcept Exception:
で補足していたら、どう探せばいいんでしょう??
投稿2021/12/13 02:40
編集2021/12/13 03:09総合スコア11235
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/13 11:35 編集
2021/12/13 11:59
2021/12/13 12:02
2021/12/13 12:18
2021/12/13 12:59
2021/12/13 14:47
0
例外の種類によって、例外が発生した場合の処理を分ける必要がない場合は全ての例外をキャッチする形でも問題ないように思えます。
そうも行かないこともありえます。
生の
except:
はSystemExit
やKeyboardInterrupt
例外もキャッチしてしまうため、プログラムを Control-C で中断することが難しくなりますし、他の問題をもみ消してしまうかもしれません。(pep8和訳より)
書き捨てのプログラムならともかく、Djangoで組むような一定の規模を持ったものでは、基本的に避けるべきだと考えます。
投稿2021/12/13 01:16
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/13 01:18 編集
2021/12/13 01:53 編集
2021/12/13 01:56 編集
2021/12/13 02:06 編集
2021/12/13 02:04
2021/12/13 02:11 編集
2021/12/13 02:13
2021/12/13 02:16
2021/12/13 02:19
2021/12/13 02:21 編集
2021/12/13 02:23 編集
2021/12/13 02:24
2021/12/13 02:24
2021/12/13 02:27
2021/12/13 02:29
2021/12/13 02:33
2021/12/13 02:34
2021/12/13 02:36
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。