PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

ifとtry...expectはどう使い分けるんですか?違いは何ですか?

f:id:nana_yu:20181206102719p:plain

質問

「 ifとtry...expectはどう使い分けるんですか?違いは何ですか?」

回答

id:hirokikyです。 かなり良い質問ですね。例外についておさらいしながら解説します。

例外についてのおさらい

使い分けの前に、例外についてのおさらいです。

例外はexceptしない場合、「外」に伝播していきます。 関数の中で例外が発生すれば、その関数を呼出した処理へ伝播し、そこでもexceptされなければさらに外へと伝播します。

例外のサンプルコード

def a():
    d = {}
    d["nothing"]  # 例外が起こる処理


def b():  # 例外がa()で発生、bでexpectしない
    a()


def c():  # bから例外が発生(a()から発生している)
    b()


c()  # 実行されると、Pythonプログラムがエラーで修了

例外をif で避けるのかexpectするのかの使い分け

例外が発生しそうな処理がある場合、ifで避ける方法かexceptする方法があります

例外の処理にifを使う場合

def a(d):  # 辞書を受け取る
    if "hello" in d:
        return ["hello"]
    else:
        return "Helloはありません"

例外の処理にexceptを使う場合

def a(d):
    try:
        return ["hello"]
    except KeyError:
        return "Helloはありません"

この場合はどちらも良い気もします。 Pythonの考え方的には except を使う処理のほうが良いかも知れません。

具体例

違いがハッキリする例を紹介します。

例えば、ファイルの読み込みの処理です。 「ファイルの存在チェックをして、あればファイルオープン、なければこうする」よりも、 「ファイルオープンして、エラーならこうする」という処理のほうが良いです。 ifでチェックして、openするまでの間にファイルが消される可能性が十分ある からです。

例外を例外のままにしておく場合

Pythonの場合、例外は外に伝播してくれます。

もし関数の引数として期待しない値が来た場合や、ファイルが存在しない場合はPython自体をエラーにしてしまおうと言う場合は、try...exceptせずにそのまま例外を外に伝播させるほうが良いでしょう。

そのほうがチェックするためのifや過剰なtry...exceptを書かずに済みます。

そもそも期待しない入力や状況であれば、例外が起こるものとしておいても問題ありません (その外部に例外処理を任せても良いわけです)。

中大規模なプログラムを書く中で、どこで例外の発生を許容して、どこで許容させないかは身についてくると思います。今は、そういうものかと感じていただければ嬉しいです。

Copyright ©2017-2018 BeProud Inc. All rights reserved.