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

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

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

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

例外

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

Python

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

Q&A

解決済

1回答

1728閲覧

[Python]発生する例外の候補を挙げる方法

Shau

総合スコア2

Python 3.x

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

例外

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

Python

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

1グッド

1クリップ

投稿2021/11/07 18:17

編集2021/11/07 18:24

環境

  • Pyhon 3.9.7
  • macOS Catalina 10.15.7(19H1519)
  • VSCode

目的

関数やクラスを利用する時に発生しうる例外を知りたい。

例外処理自体は理解しているのですが、発生する例外の候補を考えることが難しいです。
前提として初心者のため例外を理解すべく、bare-exceptやbroad-exceptを避けて実装しています。
みなさんがどのように考え、処理する例外を決めているのか、教えていただきたいです。

また、この問題に対する有益なツールなどもあれば、教えていただけると助かります。

具体例

例として組込関数の open のドキュメントを見てみます。

file を開き、対応する ファイルオブジェクト を返します。ファイルを開くことができなければ、OSError が送出されます。

とあり、OSError が発生することが分かります。
他の例外の表現は以下のようなものがありました。

'strict' はエンコーディングエラーがあると例外 ValueError を発生させます。デフォルト値である None も同じ効果です。

既存のファイルを 排他的生成モード('x')で開いた場合、 FileExistsError を送出するようになりました。

ここまでで、 open に関して以下の例外が候補になります。

  • OSError
  • ValueError
  • FileExistsError

明記されているのは以上ですが、実際に動かしてみると、引数の encoding に対して存在しないエンコーディングを指定した時には LookUpError が発生します。

このように、公式のドキュメントでさえドキュメントの限界があります。

他の標準ライブラリーであったり、pipでインストールするようなパッケージであった場合にはよりドキュメントが薄い場合もあります。

そういった状況でみなさんがどのように出てくる例外の候補を考えているのか、もしくはツールなどで検出しているのか、教えてください。

melian👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

PythonではEAFPという考え方でコーディングすることが多いです。

Python用語集のEAFPには以下のように書かれています。

glossary

1「認可をとるより許しを請う方が容易 (easier to ask for forgiveness than permission、 2マーフィーの法則)」の略です。 3この Python で広く使われているコーディングスタイルでは、通常は有効なキーや属性が存在するものと 4仮定し、その仮定が誤っていた場合に例外を捕捉します。 5この簡潔で手早く書けるコーディングスタイルには、 try 文および except 文がたくさんあるのが特徴です。 6このテクニックは、C のような言語でよく使われている LBYL スタイルと対照的なものです。 7

これがマーフィーの法則かどうかはよくわかりませんが、グレースホッパーの名言に由来する言葉だと思われます。

Grace

1"If it's a good idea…go ahead and do it. It is much easier to apologize than 2it is to get permission." -Grace Hooper 3いいアイデアなら、とにかくやってしまいなさい。許可を得るより謝る方がずっと簡単よ。

私は、この言葉を、「事前に悩んでいつまでもできないよりは、やってみて問題があれば修正していくほうが生産的だ」というように理解しています。

この考え方に従って、私は以下の方法でやります。

どんな例外が起こるかを考えているよりも、プログラムを作って動かしましょう。
一番最後のexcept節に起こった例外をprintして、その部分を無視して実行するか、あるいはエラーで終了するようなコードを書いておいて、動かしてみましょう。
運用してみて、新たな例外が見つかったら、それからその処理を追加して方が、事前に悩むよりもコーディングが進みます。

投稿2021/11/07 23:54

ppaul

総合スコア24670

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

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

Shau

2021/11/08 02:24

実装のスタイルについての説明ありがとうございます。 EAFPスタイルを念頭に、実行やテストの中で掴む例外を決めていこうと思います。 腑に落ちて方向性が定まったのでベストアンサーとさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問