2

例外の後にすべてを停止する方法はありますか?(Python)ZeroDivisionErrorの後に計算を停止する方法

たとえば、私はポストフィックスを学ぶために逆ポーランド記法電卓を作成しています。文字列に「0」がある場合、「ゼロで割り切れません」が印刷されます。

私はtry/exceptを使って欲しいものを手に入れました。

例外的に私のprintステートメントの後に "break"を入れてみましたが、最終的な "pop"がループの外側にあるので、明らかに助けになりません。そして、それは明らかに "ゼロ除算"演算が実行されず、リストが崩れてしまうので、一連のトレースバックエラーを引き起こします。

アイデア?

def RPN(ll): 
    mys = Stack() 
    for x in ll: 
     if x == '+': 
      sum_of_two = mys.new_pop() + mys.new_pop() 
      mys.push(sum_of_two) 
      """mys.print_stack()"""   #test addition 

     elif x == "*": 
      product = mys.new_pop() * mys.new_pop() 
      mys.push(product) 
      """mys.print_stack()"""    #test multiplication 

     elif x == "-": 
      subtrahend = mys.new_pop() 
      minuend = mys.new_pop() 
      subtrahend 
      minuend 
      difference = minuend - subtrahend 
      mys.push(difference) 
      """mys.print_stack()"""    #test subtraction 

     elif x == "/": 
      divisor = mys.new_pop() 
      dividend = mys.new_pop() 
      divisor 
      dividend 
      try: 
       quotient = dividend/divisor 
       mys.push (quotient) 
      except ZeroDivisionError: 
       print "Cannot divide by zero" 
      """mys.print_stack()"""    #test division 

     else: 
      mys.push(int(x)) 

    return mys.new_pop() 


example = [3,4,"-",5,"+",6,"*",0,"/"]  #test reverse polish calc 
print RPN(example) 
+0

「すべてを停止する」とはどういう意味ですか?あなたは呼び出し関数の例外を発生させますか?値をすぐに戻したいですか?あなたは完全にPythonを終了したいですか? –

+0

はい、それはうまく言葉にされていない可能性があります。 0が発生し、除算が発生すると(つまり、ZeroDivisionErrorが発生した場合)、「ゼロで割り切れない」という印字をしたいと思います。 現在、ゼロ除算以外のいくつかのエラーが発生しています。言い換えれば、私のリストに[0、 "/"]がなければ、プログラムは完璧に動作します。 – DudeWah

答えて

0

あなたは、この機能が有効な戻り値としてNone受け入れなければならないとしていると呼ばれるものは何でも、もちろんどこかの関数では、だけではなく、最後に

try: 
    quotient = dividend/divisor 
    mys.push(quotient) 
except ZeroDivisionError: 
    print 'Something to console' 
    return None 

から値を返すことができます。

また、これがコントロールチェーン内で機能する方法で、トップ機能までバブルしたい場合は、エラーを再発生させるか、別のエラーを発生させて非常にトップの機能。

class MyError(Exception): 
    pass 

def func(): 
    try: 
     func2() 
    except MyError as e: 
     print e.message 

def func2(): 
    func3(): 

def func3(): 
    RPN([...]) 

def RPN(ll): 
    ... 
    try: 
     ... 
    except ZeroDivisionError: 
     raise MyError('Zero Division') 
+0

それはとてもうまく機能しました。ありがとうございました!もし私が尋ねることができたら、それは何を正確にしたのですか?例外が発生したときの私の理解から、何かが印刷され、次に "返されない"部分がプログラムを終了しました。あなたが少し説明することができればそれはすばらしいでしょう。再度、感謝します! – DudeWah

+0

'return'は関数を終了させ、呼び出し元関数に値を返します。関数の最後で 'return'するのは一般的には良い習慣ですが、関数のどこからでも' return'することができます。 –

+0

はい、これは完全にはっきりしています。再度、感謝します! – DudeWah

関連する問題