2

예외 발생 후 모든 것을 중지 할 수있는 방법이 있습니까?(Python) ZeroDivisionError 후 계산을 중지하는 방법

예를 들어, 후진 폴란드어 표기법 계산기 (후위를 배우기 위해)를 만들고 있는데, 문자열에 "0"이 있으면 "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

"모든 것을 중지 하시겠습니까?" 호출 함수에 대한 예외를 발생 시키길 원합니까? 즉시 값을 반환 하시겠습니까? 파이썬을 완전히 종료 하시겠습니까? –

+0

예, 저조한 말을했을 수도 있습니다. 0이 나오고 나누기가 발생하면 (예 : ZeroDivisionError가 발생하는 경우) '0으로 나눌 수 없습니다'라는 메시지가 인쇄됩니다. 현재 0으로 나누는 경우를 제외하고는 발생하지 않는 몇 가지 오류가 나타납니다. 즉, 내 목록에 [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'을하는 것이 좋은 습관이지만, 함수의 어디에서나 반환 할 수 있습니다. –

+0

예, 완전히 명확합니다. 다시 한 번 감사드립니다! – DudeWah

관련 문제