2016-05-29 8 views
0

私のコードとは無関係な質問があります。私はちょうど興味がある。なぜ私は(私はあなたについて知りません)、tryとexceptループでのみValueErrorを使用できますか?例えば:Python:else ValueError:(具体的にはValueError)

print("What is 1 + 1?") 
while(True): 
    try: 
     UserInput = int(input(("Your answer here:")) 
     if(UserInput == 2): 
      print("Congratulations you are correct!") 
      break 
     else: 
      print("That is incorrect. Try again!") 
    except ValueError: 
     print("That is not a number. Try again!") 

これは完全に罰金(またはそれが必要以上に)動作しますが、なぜ(ない場合)このコードの次の部分は動作しません。

print("What is 1 + 1?") 
while(True): 
    UserInput = int(input("Your answer here:")) 
    if(UserInput == 2): 
     print("Congratulations you are correct!") 
     break 
    elif(UserInput != 2): 
     print("That is incorrect. Try again!") 
    else(ValueError): 
     print("That is not a number. Try again!") 

私はこれを実行すると、私はこのエラーを取得:

Traceback (most recent call last): 
    File "python", line 9 
    else(ValueError): 
     ^
SyntaxError: invalid syntax 

私はとValueErrorが唯一の(と思う)の試行とし、ループを除いて動作しますが、なぜそれがで動作しないことができないので、それは知っています上記のシナリオ?私は彼らが同じ結果を与えるだろうと思うが、私はすべてを知らない。あなたの驚くほどスマートな人たちが、私が働かなくてもよいし、代替案を教えてくれるかもしれません。私にこれを明確にしようとしてくれてありがとう。

答えて

2

tryexceptは、制御フローの一形態です。本質的には、このコードを実行するにはtryを意味し、例外が発生した場合はexcept(例えば、ValueError)何か他のことをします。

ifおよびelseは、制御フローの別の形態である。一緒になると、彼らは条件が真であることを意味するifを意味します。 else、何か他のことをしてください。

例外は条件ではないため、ValueErrorのような例外を除いてelseを使用することは意味がありません。代わりに、ブロックtry/exceptを使用します。

+1

事を明確にするのを助けてくれてありがとう。 – BradTheBrutalitist

3

2番目の例のSyntaxErrorは、elseが条件を必要としないという事実から来ています。最初の例は大丈夫です。

まだ良い、できるだけ短いのtry-ブロックを保つ:

print("What is 1 + 1?") 
while True: 
    try: 
     UserInput = int(input(("Your answer here:")) 
    except ValueError: 
     print("That is not a number. Try again!") 
    else: 
     if UserInput == 2: 
      print("Congratulations you are correct!") 
      break 
     else: 
      print("That is incorrect. Try again!") 
+0

私は最後に他は冗長だと思います。 – Jacobian

+0

そうでなければ、ValueErrorを設定することはできません。第2の方法であろうとなかろうと簡単だろうと思いますか? – BradTheBrutalitist

+1

@Jacobian:そうではありません – Daniel