kon_ta2016/06/21 04:00解答ありがとうございます。 提示していただいたページに書いてある方法では、自分で定義した例外をraiseで強制的に発生させていると認識しています。 一つ疑問なのですが、一般的な例外のように、どんな種類の例外なのか(または例外にあてはまるかどうか)はどの部分でどのように判定しているのでしょうか。
kon_ta2016/06/21 06:24例えばゼロで除算することを禁止するためにZeroDivisionErrorという例外があると思うのですが、これはある入力がこの例外に当たりますよとExceptionクラスで判定していると思っています。(既にこの部分の理解が間違っていたらご指摘お願いします。) 今回のように自分で例外を作成する場合、Exceptionクラスを継承したクラスを自分で作成 して、独自のエラークラスを作ると提示していただいたページに記載されていたと思います。 ただそこではraiseで強制的に例外を発生させる例しか乗っておらず、自分自身で作成した 例外クラスを先に述べたZeroDivisionErrorのように入力に応じて発生させるためには、どのようにすればいいのかが分からないのが今回の疑問点になります。 個人的に作成したクラスに引数として入力内容を渡してif文で判定するという処理をおこなうのかなと思っていたのですが、それだと現状if文と普通のメソッドで実現できてしまうのではないのかなと思っています。 冗長な文になってしまい申し訳ありません。 分かりにくい部分があれば再度ご指摘の方よろしくお願い致します。
matobaa2016/06/21 08:32なるほど。質問の意図をつかめたかどうか自信はないのですが、「引数として入力内容を渡してif文で判定するという処理をおこなう」のとおりに実装すればよいのであって、なにかを宣言すると自動的に例外が上がる、のようなしかけは特にないです。 たとえば、 https://hg.python.org/cpython/file/default/Lib/datetime.py#l246 に datetimeの_check_utc_offsetメソッドがありますが、if文で分岐しつつ、TypeErrorやValueErrorを投げ分けています。 受け取るほうがどう受け取り分けるか、については、先のドキュメントの 8.3 をみてください。 答えになってますか?
matobaa2016/06/21 08:34割ゼロのような、Pythonランタイムから発生するような例外は、こんな感じになってました: https://hg.python.org/cpython/file/default/Objects/complexobject.c#l480 complex_div が ZeroDivisionError を出してます。
kon_ta2016/06/21 10:48ありがとうございます!理解が出来ました。 最後に初歩的な質問になってしまい申し訳無いのですが、そもそもtry,exceptなどをつかって例外を表す意味は何なのでしょうか? 先程も少し書きましたが、if文などで条件に当てはまらないものははじくなどの処理で 十分に対応できてしまうのではと感じます。 何度も質問すいません。どうぞよろしくお願い致します。
matobaa2016/06/21 12:58回答になっていたようで安心しました。 そもそも例外を表す意味は……いい質問ですね。新たな質問をたてていただいたほうが面白くなるような気がするのでお願いできますか? なんだかわくわくします。
matobaa2016/06/22 02:09 編集ありがとうございます。つづきはこちらで: https://teratail.com/questions/38761 たいへん面白いことになってます! Cの人の回答とか興味深い。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/21 04:00
2016/06/21 04:35
2016/06/21 05:36
2016/06/21 06:24
2016/06/21 08:32
2016/06/21 08:34
2016/06/21 10:48
2016/06/21 12:58
2016/06/21 13:40
2016/06/22 02:09 編集