🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

3485閲覧

[python]errorハンドリングのベストプラクティスがわからない

pokemonta

総合スコア170

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/01/06 06:19

以下のようなpythonプログラムを組みまして、persondata = get_personList(Id)で発生したエラーを
Exceptionで拿捕してメッセージをセットするようにしています。

しかしながら、Id =SiteId + persondata['personId']処理において
persondataでローカル変数が見つからないというエラーが発生します。

これを回避するためにId =SiteId + persondata['personId']を
tryの中に入れますと今度は、get_data(Id)でIdが見つからないというエラーが発生します。

これを回避するためにresult = get_data(Id)も
tryの中に入れるしか方法はないのでしょうか?(最後のコード)
result = get_data(Id)に対しても別のtryを設定したいのですがいい方法はありませんか?

python

1 try: 2 persondata = get_personList(Id) 3 except Exception as ex: 4 error.setMassage('E403') 5 result = None 6 7 Id =SiteId + persondata['personId'] 8 result = get_data(Id)

python

1 try: 2 persondata = get_personList(Id) 3       Id =SiteId + persondata['personId'] 4 except Exception as ex: 5 error.setMassage('E403') 6 result = None 7 8 result = get_data(Id)

python

1 try: 2 persondata = get_personList(Id) 3       Id =SiteId + persondata['personId'] 4       result = get_data(Id) 5 except Exception as ex: 6 error.setMassage('E403') 7 result = None 8

python

1 try: 2 persondata = get_personList(Id) 3       Id =SiteId + persondata['personId'] 4       try: 5       result = get_data(Id) 6 except Exception as ex: 7 ・・・・ 8 except Exception as ex: 9 error.setMassage('E403') 10 result = None 11

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

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

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

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

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

guest

回答1

0

ベストアンサー

Exception を別に定義して別々の例外を投げるようにしましょう。そうすれば try は一箇所で済みます。
8. エラーと例外 — Python 3.9.1 ドキュメント

Python

1class ApplicationError(Exception): 2 pass 3 4class PersonNotFound(ApplicationFound): 5 ... 6 7class ResultNotFound(ApplicationFound): 8 ... 9 10 try: 11 persondata = get_personList(Id) 12       Id =SiteId + persondata['personId'] 13       result = get_data(Id) 14 except PersonNotFound as ex: 15 ... 16 except ResultNotFound as ex: 17 ...

こんなふうにして例外によって処理を分けることが出来ます。

投稿2021/01/06 06:32

A_kirisaki

総合スコア2853

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

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

pokemonta

2021/01/06 06:37

同じエラーを投げたときに get_personList(Id)で発生したのか get_data(Id)で発生したのか判別できないのではないかと懸念していました。 例えばDBの接続エラーはどちらのgetでも発生ます。
A_kirisaki

2021/01/06 06:40

それはあくまで「DB 接続エラー」なのでそれとして扱い「500」系のエラーを返すのが正しい働きなのではないかと思います。
pokemonta

2021/01/06 06:51

例が悪かったですね。 get_personList(Id)で従業員名簿から対象の人を抽出します result = get_data(Id)で対象の人の勤怠データを抽出します。 どちらもデータがなければKeyErrorのexceptを発行するのですが(DBが発行) 意味合いが違います。前者はマスタで後者はトランです。 このような場合に違いが分かればよいと思いました
pokemonta

2021/01/06 06:53

前者は、従業員データがありません 後者は、勤怠実績がありませんとメッセージを使い分けたいです
A_kirisaki

2021/01/06 06:59

get_personList と get_data の内部で KeyError をキャッチしてあげて回答に挙げた例外をそれぞれ上げ直すとよいのではないのでしょうか。それぞれの中で try が必要になりますが、上のレベルでの try ネストは避けられます。
pokemonta

2021/01/06 07:01

成程。。。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問