2017-09-22 2 views
1

함수 a() 및 b()가 예외를 throw 할 수 있습니다. 코드 :적절한 방법 UnboundLocalError : 예외가 발생했을 때 할당 전에 참조 된 로컬 변수 ''?

def foo(): 
    try: 
     x = a('test') 
     b(x, 'test2') 
    except Exception as ex: 
     raise Exception('Message error: ' + str(x) + " " + str(ex)) #here could be UnboundLocalError: Local variable 'x' referenced before assignment 

내 솔루션은 다음과 같습니다

def foo(): 
    try: 
     x = a('test') 
     try: 
      b(x, 'test2') 
     except Exception as ex: 
      raise Exception('Message error: ' + str(x) + " " + str(ex))   
    except Exception as ex: 
     raise Exception('Message error: ' + str(ex)) 

그것을 할 수 있는가 : 예외가 할당 "로컬 변수 'x'를 할당하기 전에 참조 UnboundLocalError"동안 던지는 동안이 코드는 처리하지 않습니다 더 까다 롭고 우아한? 이제 템플릿을 제외하고 두 번 시도해 보겠습니다. 그것은()가 성공적으로하지 않았다 독자를 보여줍니다 개인적으로

try: 
    x = a('test') 
    b(x, 'test2') 
except Exception as ex: 
    if not 'x' in locals(): 
     x = 'undefined' 
    raise Exception('Message error: ' + str(x) + " " + str(ex)) 

, 나는 더 우아한 블록을 제외/별도의 시도는 모두 예외를 잡는 생각 :

+0

을 왜 처음에 예외 메시지에서'x'를 참조해야합니까? – roganjosh

+0

또한 첫 번째 블록에서 원했던 것처럼 두 가지 기능을 포괄적 인 예외로 번들로 묶는 것이 좋지 않습니다 (또는 일반적으로 '제외'로 사용). 'x = a ('test')'가 실패했거나'b (x, 'test2')'입니까? 현재 해독 방법은 알려지지 않은 또 다른 예외를 제기하는 것입니다. – roganjosh

답변

0

이 당신이 그것을 할 수있는 한 가지 방법은 아마도 완전하고있는 마스크 진짜 문제 UnboundLocalError을 허용하지 : 여기

try: 
    x = a('test') 
except Exception as ex: 
    raise Exception('oh no, a() failed') 
try: 
    b(x, 'test2') 
except Exception as ex: 
    raise Exception('oops, b() failed') 

일부 문서가 약 locals() : https://docs.python.org/3/library/functions.html#locals

+1

하지만 흐름의 논리는 의미가 없습니다. 'x = a ('test')'가 실패하면'b (x, 'test2')'는 분명히 불가능합니다. 왜 같은 try 안에 넣을까요? 두 개의 분리 된'try' /'except'를 각각 하나씩 가지고 그것으로 끝냈습니다. 이처럼 중첩 예외에 대한 공상이나 비단뱀은 없습니다 ... – roganjosh

+1

당신 말이 맞아요, 제 대답으로는 분명하지 않았습니다. 이것이 내가 두 가지 예외를 모두 잡는다는 의미입니다. 그러나 UnboundLocalError는 발생하지 않습니다. 더 나은 전략으로 편집되었습니다. – Mario

+1

훨씬 더 좋습니다 :) 중첩보다 덜 인상적으로 보이지만 훨씬 더 의미가 있습니다! – roganjosh

0

당신은 [Python]: The try statementelse 절 사용할 수 있습니다

def foo(): 
    try: 
     x = a("test") 
    except Exception as ex: 
     raise Exception("Message error (a): " + str(ex)) 
    else: 
     try: 
      b(x, "test2") 
     except Exception as ex: 
      raise Exception("Message error (b): " + str(x) + " " + str(ex)) 
관련 문제