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

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

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

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

Q&A

解決済

2回答

225閲覧

pythonでの例外処理のcatchについて

chomechome

総合スコア4

Python

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

0グッド

1クリップ

投稿2020/05/19 08:56

編集2020/05/19 09:58

前提・実現したいこと

pythonにてCI/CDツールを作成しております。
コード全般にかかわる例外処理にて、catch節でどう例外をキャッチしようか悩んでおります。
catch後にstacktraceなどの情報を加工して、ユーザに表示することを考えております。
pythonとしての例外処理のベストプラクティスを知りたいです。

検討中のパターン

その1)
exceptで全例外を補足する

try: <例外発生> except: t, v, tb = sys.exc_info() ms = "xxxxxに失敗しました。{0}".format(traceback.format_exception(t,v,tb)) logger.error(ms)

その2)
exceptでException例外を補足する

try: <例外発生> except Exception as e: logger.error(e)

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

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

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

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

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

tachikoma

2020/05/19 09:52

どの程度エラーメッセージを加工する予定ですか(その2を応用)?またstacktraceも残しますか?
chomechome

2020/05/19 09:59

stacktraceを残し、stacktraceの先頭にメッセージを付与する方針です。
guest

回答2

0

ベストアンサー

その1でもその2でもキャッチできる例外は同じなので、構文に関する趣味のレベルでお答えします。

今回はエラーの発生元に関する詳細が必要なようなので、その1だけを使うのがいいのかなと思いました。Exeptionのメッセージを単に表示させるだけであればその2のままでいいのですが、sysモジュールを使ってstacktraceを含む例外の詳細な情報を取得すのであれば、excep Exception as eで取得したeは情報がダブるだけで必要なさそうに見えます。

また、Pythonらしい書き方について少し言及しておくと、すべての例外をキャッチする構文を使う場面としては、下記のようにより具体的な例外をキャッチしたあとで、それでも残る可能性に対して使う場合があるかなと思いました。ただ、今回は具体的な例外を想定できないので最初からすべての例外を捕まえる書き方で問題ないと思います。

Python

1 2try: 3 ... 4except IOError as e: 5 # do something 6except NameError as e: 7 # do something 8except: 9 ...

投稿2020/05/19 10:35

編集2020/05/19 10:35
tachikoma

総合スコア3601

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

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

chomechome

2020/05/19 10:56

丁寧でわかりやすいご回答ありがとうございます! スッキリしました!
guest

0

その1とその2は例外処理のしたかとしては同じで、「全ての例外を捕捉して処理を継続する」のように見えます。

例外については、

  • その処理で発生することが想定され、どのように対処すべきかわかっているもののみ処理する

のが普通だと思います。

python

1try: 2 <ファイル入出力処理> 3except IOException as e: 4 <例外発生時の対応>

投稿2020/05/19 09:12

編集2020/05/19 09:13
TakaiY

総合スコア12834

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

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

chomechome

2020/05/19 09:21

ご回答ありがとうございます。 >その処理で発生することが想定され、どのように対処すべきかわかっているもののみ処理する のが普通だと思います。 全例外を補足し、メッセージを加工してユーザに表示する必要があります。 発生することが想定されるとのことですが、pythonはスクリプト言語でjavaの検査例外とは異なり、実装側で漏らさずcatchすることは難しいと考えております。 そのため、一番外側の関数で全例外を補足しようと考えております。
TakaiY

2020/05/19 10:24

> 全例外を補足し、メッセージを加工してユーザに表示する必要があります ということであれば、「その2」のように全例外を捕捉すればよいと思いますので、質問の目的がよくわかりません。 以下、本筋ではありません。 > pythonはスクリプト言語でjavaの検査例外とは異なり、実装側で漏らさずcatchすることは難しい どのような言語であっても、自分で作った処理であれば、どのような例外が発生するかはわかるはずです。 外部のライブラリを使うとしても、よほど酷い作りのものでなければ、確認できると思います。スクリプト言語であるかどうかは関係ないでしょう。
chomechome

2020/05/19 10:33 編集

>外部のライブラリを使うとしても、よほど酷い作りのものでなければ、確認できると思います。スクリプト言語であるかどうかは関係ないでしょう。 わたしの今までの例外に対する認識が甘かったです。言語関係なく、例外をしっかり捕捉していきたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問