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

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

詳細はこちら
Python 3.x

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

例外処理

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

Q&A

解決済

2回答

2488閲覧

例外処理を実行して返ってくるNoneについて質問です。

kngtkhr

総合スコア8

Python 3.x

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

例外処理

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

0グッド

0クリップ

投稿2019/10/05 07:55

Python初心者で関数と例外処理の勉強をしていました。
よろしくお願い致します。

エラーは出ていませんが例外処理で返ってくるNoneについて分からないためモヤモヤしております。

前提・実現したいこと

例外処理でNoneが返ってきます。このNoneがなぜ出てくるのかを知りたいです。

発生している問題・エラーメッセージ

下記の関数を実行すると80.0と正しく返ってきます。
しかし、print(str_float('80'))の部分をprint(str_float('abc'))のように例外を発生させるようにすると、例外のメッセージと一緒にNoneが一緒に出力されます。

このように返ってきます。

No change. None

該当のソースコード

Python

1def str_float(x): 2 try: 3 return float(x) 4 except ValueError: 5 print("No change.") 6print(str_float('80'))

試したこと

調べてみましたが期待する内容が出てきませんでした。

補足情報(FW/ツールのバージョンなど)

Python 3.6.5

よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

始めから『例外が発生する前提』で考えてみましょう。
このとき、関数str_floatは次のように書き換えられます。

Python

1def str_float(x): 2 print("No change.")

さて、Pythonの関数は必ず値を返します。
return文が無い場合は、return None が補われます。

つまり次のように書いているのと同じです。

Python

1def str_float(x): 2 print("No change.") 3 return None # 単に return だけでも意味は同じ

このNoneがなぜ出てくるのかを知りたいです。

返り値のNoneを、呼び出し元で出力しているからです。

投稿2019/10/05 08:02

LouiS0616

総合スコア35668

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

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

kngtkhr

2019/10/05 08:34

ご回答ありがとうございます???? ================================= さて、Pythonの関数は必ず値を返します。 return文が無い場合は、return None が補われます。 ================================= この部分がとても理解しやすかったです。 もう一点質問させてください。 関数でretunrn文がない場合、return Noneが補われるのでしたら、 関数で例外処理を書いている場合、例外が発生するときは必ずNoneも返ってくるのでしょうか? Noneが出力されずに例外が発生した分だけ出力される方法があるのかと思い質問いたしました。 たくさんすみません。 よろしくお願い致します。
LouiS0616

2019/10/05 08:54

> 例外が発生するときは必ずNoneも返ってくるのでしょうか? 関数内で例外を捕捉しなかった場合は、Noneは帰りません。 例外による脱出はreturnに依る脱出と全く異なる仕組みです。 私が最初に『例外が発生する前提』を据えたのは、本件が例外と関係ないことを強調したかったからです。 関数内で例外の発生/その補足・処理が完結していますので。
kngtkhr

2019/10/05 12:55

ありがとうございます<(_ _)> そうだったのですね。私は質問当初、例外によるものだと思っていましたが関数によるNoneの発生だと分かりました。 助かります。スッキリしました。
guest

0

float(x)で例外が発生した時点でexcept ValueError:の飛びます。
そのあと、returnがないため、関数はNoneを返します。
なにかを返したいならreturn 何かをする必要があります。

投稿2019/10/05 08:00

nomuken

総合スコア1627

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

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

kngtkhr

2019/10/05 08:22

ご回答ありがとうございます! Noneが返ってくるのはtry内でreturnがあるからなのですね。 return 何か でNone以外を返したいと思い、except内のprintの次の行にreturn str(x)と新たに書いてそのままの文を返すことができました。
nomuken

2019/10/05 08:40

> Noneが返ってくるのはtry内でreturnがあるからなのですね。 いいえ、違います。 「float(x)」で例外が発生した時点で 「 return float(x)」の行に復帰することはありません。「except ValueError:」のブロックを終えたとしても、「「float(x)」がNoneを返して、returnした」みたいな解釈はされません。 「print("No change.")」を実行した後、「except ValueError:」のブロックを抜け、関数の終端に達します。returnで値を返さないことからNoneを返したことになります。
kngtkhr

2019/10/05 08:49

ありがとうございます???? 理解しました! exceptを抜けた後にreturnで値を返さなかったためNoneが出力されたのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問