2

有什麼辦法在發生異常之後停止所有操作?(Python)如何在ZeroDivisionError之後停止計算

例如,我創建了一個反向波蘭表示法計算器(用於學習postfix),並且如果我的字符串中存在「0」,我想確保「不能被零除」。

我得到它做我想使用嘗試/除了。

我試圖在我的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

可以從任何位置的功能不只是在最後

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

當然,無論調用此函數將不得不接受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'只是結束一個函數並向調用函數返回一個值。在函數結尾處「返回」通常是一種很好的做法,但是您可以從函數的任何位置「返回」。 –

+0

現在完全清楚了。再次感謝! – DudeWah