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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

例外処理

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

Python

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

Q&A

解決済

3回答

386閲覧

エラーの詳細で例外処理するには

ramin

総合スコア34

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

例外処理

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

Python

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

0グッド

0クリップ

投稿2019/06/25 14:38

エラーの種類ではなくその詳細内容で例外処理を行いたいのですが可能でしょうか?

例えば以下二つは同じZeroDivisionErrorですが、その詳細内容によって別々の例外処理を行いたいです。
あくまで例えなので、そもそも/と%で別処理をするなどはなしでお願いします。

python

1try: 2 a = 1 / 0 3except ZeroDivisionError: 4 traceback.print_exc() # ZeroDivisionError: division by zero(エラー内容)

python

1try: 2 a = 1 % 0 3except ZeroDivisionError: 4 traceback.print_exc() # ZeroDivisionError: integer division or modulo by zero(エラー内容)

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

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

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

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

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

guest

回答3

0

ベストアンサー

エラーの種類ではなくその詳細内容で例外処理を行いたいのですが可能でしょうか?

ゼロ除算の種類で例外クラスが別れていない以上、推奨できませんが、args 属性でメッセージの内容を取得できるので、その中身で次のように条件分岐はできます。
試したところ、ゼロ除算でも以下の3パターンがありました。(他にないかはわかりません。)

python

1try: 2 a = 1.0 / 0 # 浮動小数点数 / 0 3 a = 1 / 0 # 整数 / 0 4 a = 1 // 0 # 整数 // 0 5 a = 1 % 0 # 整数 % 0 6except ZeroDivisionError as e: 7 msg, = e.args 8 print(msg) 9 if msg == "integer division or modulo by zero": 10 print("整数 // 0 または 整数 % 0 が発生") 11 elif msg == "division by zero": 12 print("整数 / 0 が発生") 13 elif msg == "float division by zero": 14 print("浮動小数点数 / 0 が発生")

args 属性について

組み込み例外 — Python 3.7.4rc1 ドキュメント

args
例外コンストラクタに与えられた引数のタプルです。組み込み例外は普通、エラーメッセージを与える一つの文字列だけを引数として呼ばれますが、中には (OSError など) いくつかの引数を必要とし、このタプルの要素に特別な意味を込めるものもあります。

この args の値は例外オブジェクトを作成したときのコンストラクタ引数が保存されています。
たいていはより詳細なエラーメッセージであったり、エラー番号などの追加情報が入っていると思います。

投稿2019/06/25 14:51

編集2019/06/25 14:56
tiitoi

総合スコア21956

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

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

ramin

2019/06/25 16:47

ありがとうございます! 最終的にはstr(e)で同じ流れで実装しました。
guest

0

エラー文字列をとってきてそこから処理を分けるという話になりますが、
いかにも、処理系が変わったら動かなくなることになりそうな

投稿2019/06/25 14:46

y_waiwai

総合スコア87749

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

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

ramin

2019/06/25 16:51

回答ありがとうございます! 今のところ自分でしか使う予定がないのでひとまず文字列で分岐させてみます。
y_waiwai

2019/06/26 00:22

まあ、例外の文字列ってのはべつに規格で決まってるとかではないので、pythonのバージョンやリビジョンが変わるとかすると変わるかも、というのを覚悟しとかないといけないですね
ramin

2019/06/26 14:45

なるほど、そういうこともありえるのですね・・・ ありがとうございます
guest

0

例示だと微妙ですが、例外のパラメータ見て処理分けたい(エラーコード見て復旧したり別の例外にラップして再スローしたり)というなら普通にある話だと思います。

投稿2019/06/25 14:51

gentaro

総合スコア8949

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問