質問
「 ifとtry...exceptはどう使い分けるんですか?違いは何ですか?」
回答
id:hirokikyです。 かなり良い質問ですね。例外についておさらいしながら解説します。
例外についてのおさらい
使い分けの前に、例外についてのおさらいです。
例外はexceptしない場合、「外」に伝播していきます。 関数の中で例外が発生すれば、その関数を呼出した処理へ伝播し、そこでもexceptされなければさらに外へと伝播します。
例外のサンプルコード
def a(): d = {} d["nothing"] # 例外が起こる処理 def b(): # 例外がa()で発生、bでexceptしない a() def c(): # bから例外が発生(a()から発生している) b() c() # 実行されると、Pythonプログラムがエラーで修了
例外をif で避けるのかexceptするのかの使い分け
例外が発生しそうな処理がある場合、ifで避ける方法かexceptする方法があります
例外の処理にifを使う場合
def a(d): # 辞書を受け取る if "hello" in d: return d["hello"] else: return "Helloはありません"
例外の処理にexceptを使う場合
def a(d): try: return d["hello"] except KeyError: return "Helloはありません"
この場合はどちらも良い気もします。
Pythonの考え方的には except
を使う処理のほうが良いかも知れません。
具体例
違いがハッキリする例を紹介します。
例えば、ファイルの読み込みの処理です。 「ファイルの存在チェックをして、あればファイルオープン、なければこうする」よりも、 「ファイルオープンして、エラーならこうする」という処理のほうが良いです。 ifでチェックして、openするまでの間にファイルが消される可能性が十分ある からです。
例外を例外のままにしておく場合
Pythonの場合、例外は外に伝播してくれます。
もし関数の引数として期待しない値が来た場合や、ファイルが存在しない場合はPython自体をエラーにしてしまおうと言う場合は、try...exceptせずにそのまま例外を外に伝播させるほうが良いでしょう。
そのほうがチェックするためのifや過剰なtry...exceptを書かずに済みます。
そもそも期待しない入力や状況であれば、例外が起こるものとしておいても問題ありません (その外部に例外処理を任せても良いわけです)。
中大規模なプログラムを書く中で、どこで例外の発生を許容して、どこで許容させないかは身についてくると思います。今は、そういうものかと感じていただければ嬉しいです。