(Python)如何在ZeroDivisionError之后停止计算

时间:2016-09-24 00:37:19

标签: python-2.7 stack postfix-notation divide-by-zero try-except

有没有办法在异常后停止一切?

例如,我正在创建一个反向抛光符号计算器(学习后缀),我想确保"不能除以零"如果有" 0"则打印出来。在我的字符串中。

我用try / except做了我想做的事。

我尝试过"休息"我在异常中的打印声明后,但显然没有帮助,因为我的最终" 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)

1 个答案:

答案 0 :(得分: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')