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

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

新規登録して質問してみよう
ただいま回答率
85.48%
例外

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

例外処理

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

Python

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

Q&A

解決済

2回答

1567閲覧

pythonの例外処理について

akzo

総合スコア5

例外

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

例外処理

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

Python

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

0グッド

0クリップ

投稿2020/02/01 12:12

学習いていて思ったのですが、finallyの必要性を感じません。あってもなくても同じなのでしょうか。

try: n = 0 ans = 2 / 0 print(ans) except ZeroDivisionError as er: print(er) finally: print("処理終了")
のコードと、
try: n = 0 ans = 2 / 0 print(ans) except ZeroDivisionError as er: print(er) print("処理終了")
のふたつのコードで同じ結果が返ってきて疑問に思いました。

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

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

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

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

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

guest

回答2

0

同じ実行結果になるのは例外を握り潰しているからです。
次のような例が適当でしょう。

例1

例えば、例外を上位に送出するようなとき。

Python

1try: 2 print('try') 3 1 / 0 4except ZeroDivisionError: 5 print('except') 6 raise 7finally: 8 print('finally') 9 10print('out of block')

実行結果 Wandbox

try except finally Traceback (most recent call last): File "prog.py", line 3, in <module> 1 / 0 ZeroDivisionError: division by zero

例2

またfinally節はtry節/except節内でreturn文が実行された場合も呼び出されます。

Python

1def func(): 2 try: 3 return 1 4 finally: 5 print('finally') 6 7 return 2 8 9ret = func() 10print(ret)

実行結果 Wandbox

finally 1

finallyの役割

例外が起ころうが/起こるまいが無視できない処理をfinally節に書きます。
リソースの解放などに相当します。

Python

1res = リソースを確保 2try: 3 色んな処理 4except ...: 5 例外処理 6finally: 7 resの解放

しかしこのような場合はwith文を使うのがより適切なケースが多いように思います。

投稿2020/02/01 12:19

編集2020/02/01 12:42
LouiS0616

総合スコア35660

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

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

akzo

2020/02/01 12:49

ありがとうございます!!
guest

0

ベストアンサー

finally節には、try節で実行した処理が「正常に実行された後でも例外が起きた後でも、どちらの場合でも実行したい処理」を書きます。

Python

1l = [2,3,4,5] # 正常 2l = [2,3,0,5] # 異常 3 4ans = 0 5try: 6 for n in l: 7 ans += 60 / n 8except ZeroDivisionError as er: 9 print(er) 10finally: 11 # 異常が発生する前まででもよいので結果が見たい 12 print(ans)

他の具体例としては終了時に常に行う処理: finallyのコードが分かりやすいかと思います。

投稿2020/02/01 12:32

can110

総合スコア38266

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

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

akzo

2020/02/01 12:50

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問